2015-12-14 54 views
0

我有兩種註冊形式:一種可以註冊任何電子郵件地址,另一種只能註冊一個特定域名。如何允許從User.rb模型?Rails郵件驗證基於參數

這樣的事情可能工作:

validates_format_of :email, :with => /.io/ 

但因爲我有兩個登記表和表單中的URL爲2的ID:

validates_format_of :email, :with => /.io/ if params[id] == 2 

我也明白,params不在模型中可用,但基於我想實現的目標,該如何實現?

基本上用id = 1可以註冊任何電子郵件。使用id = 2的表格只能使用.io電子郵件地址(域)進行註冊。

回答

1

這聽起來很適合驗證上下文。 A validates*方法可以接受:on選項,該選項是將在其中觸發確認的「上下文」的名稱;例如:

validates_format_of :email, :with => /\.io\z/, on: :restricted_email 

此驗證如果選項context: :restricted_email傳遞給savesave!方法纔會被觸發。下面是你可能在你的控制器使用方法:

def create 
    @user = User.new(params[:user]) 

    if params[:id] == 2 
    @user.save!(context: :restricted_email) 
    else 
    @user.save! 
    end 
end 

下面是關於這一主題的好博客文章:http://blog.arkency.com/2014/04/mastering-rails-validations-contexts/

+0

錯誤:'提供的正則表達式使用多線錨(^或$),這可能會帶來安全風險。你是否想要使用\ A和\ z,或者忘記添加:multiline => true選項?' – Sylar

+0

我編輯了我的答案,將'$'更改爲'\ z'。 –

+0

喬丹,最後一個問題。使用你的代碼,如何輕鬆地將更多的域添加到正則表達式? – Sylar

1

您可以將屬性添加到模型,將指示哪些形式的登記是從,就像:registered_io,通過一個隱藏字段的形式在你的模型,你可以只發送到你的模型

#... 
<%= f.hidden_field :registered_io, value="true" # or false %> 

然後來了做一個

validates :format_of_io_email_should if self.registered_io 
validates :format_of_universal_email_should if !self.registered_io 

def format_of_io_email_should 
# regex ahoy or whatever 
end 
def format_of_universal_email_should 
# same same but different 
end 

不要忘了也運行你的遷移來存儲屬性!

$ rails migration add_column_registered_io_to_user registered_io:boolean 

另外不要忘記允許:registered_io在控制器中的強參數。

+0

這是更好的選擇,在我看來。無論您將用戶限制爲「.io」電子郵件地址的標準如何,您可能都希望在用戶創建後維護該上下文。否則,您無法知道具有「.io」電子郵件地址的現有用戶是否屬於給定的組。 – meagar

+0

我從模型中獲得'未定義的registered_to'方法。 – Sylar

+0

'registered_to'或'registered_io'?前往'$ rails console'來檢查它。 – irbanana