Asked Oct 3rd, 2017 8:41 AM 135 0 1
  • 135 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?

Share
  • 135 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 ANSWERS


Answered Oct 4th, 2017 1:47 AM
Accepted
+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!

Share
Truong Minh Thuc @minhthuc229
Oct 4th, 2017 5:11 AM

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

+1
| Reply
Share
Oct 4th, 2017 6:19 AM

@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 😃

0
| Reply
Share
Truong Minh Thuc @minhthuc229
Oct 4th, 2017 8:28 AM

@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 😃)

+1
| Reply
Share
Oct 4th, 2017 9:03 AM

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

0
| Reply
Share