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?
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
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!
Cảm ơn @bs90. Work like a charm!
@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
@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 )
@minhthuc229 override xong có thể cần config lại routes, dẫn route register sang controller của mình