Yêu cầu thg 10 3, 2017 8:41 SA 180 0 1
  • 180 0 1
0

Cho phép người dùng đăng ký tài khoản trong giới hạn cho phép như thế nào?

Chia sẻ
  • 180 0 1

Chào mọi người, mình có một trường hợp như sau: Giả sử mình tạo 1 trang web nội bộ chỉ cho phép người nội bộ đăng ký mà thôi! Trong trường hợp này giả sử mình có toàn bộ email của mọi người trong nội bộ được lưu vào bảng EmailPermission. Mình sử dụng gem devise để tạo Model. Tuy nhiên mình lại không biết làm cách nào để cho phép đăng ký tài khoản khi và chỉ khi email đăng ký có trong bảng EmailPermission. Rất mong mọi người chỉ dẫn!

1 CÂU TRẢ LỜI


Đã trả lời thg 10 4, 2017 1:47 SA
Đã được chấp nhận
+3

Mình thấy cũng có vài cách. Bạn có thể đặt validate trong model User của bạn.

...
validate :whitelisted
...
private
  def whitelisted
    unless EmailPermission.exists? email: self.email
      # raise lỗi ở đây
    end
  end
end

# or

validates :email, :with => EmailAddressValidator
# rồi viết class validator riêng

Hoặc có thể khai báo lại RegistrationsController của devise trong code của mình để thêm xử lý check email.

class RegistrationsController < Devise::RegistrationsController
  def create
    if EmailPermission.exists? email: params[:user][:email]
      super
    else
      # raise lỗi ở đây
    end
  end
end

Hoặc có thể custom lại email regex cho Devise (cách này hơi ảo 😐)

# config/initializers/devise.rb
config.email_regexp = Regexp.new("^(#{EmailPermission.all.map(&:email).join('|')})$")

Mình chưa làm thật bao giờ nên không biết chạy có ổn không và cái nào là best practice (yaoming) Hi vọng giúp ích được cho bạn!

Chia sẻ
Avatar Truong Minh Thuc @minhthuc229
thg 10 4, 2017 5:11 SA

Cảm ơn @bs90. Work like a charm!

thg 10 4, 2017 6:19 SA

@minhthuc229 Cuối cùng thì bạn chọn cách nào? Nghĩ kỹ thì cách thứ 3 sẽ chạy sai khi thêm record mới vào bảng EmailPermission vì lúc đó cái config này không được load lại 😃

Avatar Truong Minh Thuc @minhthuc229
thg 10 4, 2017 8:28 SA

@bs90 mình chọn cách 1 😃, mình dùng errors.add :email, "is Invalid" cách 2 mình chưa thử nhưng có lần mình thử override cái controller của devise thì views_devise lại không customize được. Cách cuối mình chư thử vì mình k rành regex lắm 😃)

thg 10 4, 2017 9:03 SA

@minhthuc229 override xong có thể cần config lại routes, dẫn route register sang controller của mình 😃

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí