3

我對Rails新手,我面臨的問題。我有validates_inclusion_of Rails 3與查詢不按預期工作

模型

Model1 
id: integer 
account_id: integer 

Account 
id: integer 

我在型號1驗證如下,

型號代碼:

validates :account_id, :inclusion => { :in => Account.find(:all).collect(&:id)} 

我用 查看代碼下拉:

<%= f.select :account_id, @accounts.collect {|acc| [acc.name, acc.id]}, {:prompt => 'Select Account' }, { :selected => @defaultaccount, :class => 'selectwidth' } %> 

我正在使用客戶端驗證來驗證提交表單之前的字段。我正在使用Heroku來部署我的應用程序。

我先創建一個帳戶,然後從表單中嘗試創建一個新的model1。下拉列表中填入了我擁有的所有帳戶。然後我從下拉列表中選擇一個我創建的賬戶,客戶端驗證生效並且顯示「無效」,這是validates_inclusion_of的錯誤消息,就好像該賬戶從不存在一樣。不知道發生了什麼,我檢查了數據庫並創建了帳戶,這就是爲什麼首先在帳戶中加載下拉菜單的原因。

我將validates_inclusion_of更改爲rails 3驗證:account_id,:inclusion => {:in => {}}語法並重新部署。現在我嘗試在新的model1表單中選擇該帳戶,下拉列表不會爲先前創建的帳戶顯示錯誤。

因此,然後我創建了一個新帳戶,並嘗試爲驗證失敗重新生成的新帳戶創建新的model1。

那麼它像一個緩存問題?這是客戶端驗證問題嗎?我盡我所能去嘗試並找出問題所在,但我對發生的事情不知所措。

所以,每次我創建一個帳戶,它希望我重新部署哪個會殺死應用程序。我如何擺脫這個問題?不確定發生了什麼事。

配置, 的Rails 3 在Heroku的 部署使用資產管道

寶石: 客戶端驗證 雷

回答

2

它不工作,只要你想,因爲:in => Account.find(:all).collect(&:id)它的評價在生產模式只是一個時間,當Rails的加載類。我承認我不明白這種驗證背後的原因。無論如何,如果你真的想達到這個目標,你必須使用custom validator

+0

我沒有給出驗證查詢的整個邏輯,只是爲了簡單:)嗯謝謝關於評估的負責人。 – Baaju 2012-04-14 11:00:45

+0

好的。有關驗證和範圍的評估問題有時可能會讓你生氣:) – lucapette 2012-04-14 11:02:13

1

目前,一旦服務器啓動的語句被執行(爲你正確地意識到) 。您需要將其包裝在一個lambda中,以便在驗證完成後執行。

1.8.7語法:

validates :account_id, :inclusion => { :in => lambda {Account.find(:all).collect(&:id)}} 

1.9.2語法:

validates :account_id, :inclusion => { :in => ->{Account.find(:all).collect(&:id)]} 
+0

是的。我忘了提及可以使用proc或lamba。 – lucapette 2012-04-14 10:59:54