2013-04-16 84 views
2
class User < ActiveRecord::Base 
    belongs_to :school 

    validates :email, :email => { :message => "Must be a valid email." }, :format => { :with => /\A[\w+\-.][email protected]#{Regexp.quote(school.email_domain)}\z/i } 

end 

我希望能夠驗證創建用戶的電子郵件是否與他們學校的電子郵件域相匹配。我通過創建用戶:訪問模型關聯模型上的數據以執行驗證

@school.users.create(params[:user]) 

錯誤拋出:

undefined local variable or method `school' for #<Class:0x007f8aaabb0df0> 

感謝您的幫助!

+0

什麼是問題?目前沒有工作嗎? –

+0

未定義的局部變量或方法'學校'爲#

+0

嘗試使用':school'而不是'school'嗎? –

回答

2

你收到這個錯誤,因爲你想打電話給你類的範圍內,而不是你的類的實例#school方法,並#school是一個實例方法。

要調用實例方法構建您的驗證格式的正則表達式的時候,你可以提供一個lambda:with選項,如下所示:

validates :email, 
    :message => "Must be a valid email", 
    :format => { :with => lambda {|user| /\A[\w+\-.][email protected]#{Regexp.quote(user.school.email_domain)}\z/i } } 

這拉姆達將在你的模型實例調用,讓您調用方法在您的User實例上,如#school。有關更多詳細信息,請參閱validates_format_of的文檔。

+0

真棒斯圖爾特!要仔細看看lambdas! –

+1

查看這篇文章的一個偉大的寫作:http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/ –