Ruby on rails 3 验证Rails 3的\u包含\u,查询未按预期工作

Ruby on rails 3 验证Rails 3的\u包含\u,查询未按预期工作,ruby-on-rails-3,validation,activerecord,client-side-validation,Ruby On Rails 3,Validation,Activerecord,Client Side Validation,我是Rails新手,我面临一个问题。我有 模型 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.

我是Rails新手,我面临一个问题。我有

模型

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' } %>
'selectaccount'},{:selected=>@defaultaccount,:class=>'selectwidth'}%>
在提交表单之前,我使用客户端验证来验证字段。我正在使用Heroku部署我的应用程序

我先创建一个帐户,然后从表单中尝试创建一个新的model1。下拉列表中填充了我拥有的所有帐户。然后,我从下拉列表中选择一个我创建的帐户,客户端验证生效并显示“无效”,这是validates_inclusion_的错误消息,就好像该帐户不存在一样。我不确定会发生什么,我检查了数据库并创建了帐户,这就是为什么下拉列表首先加载了帐户

我将的validates_inclusion_更改为rails 3 validates:account_id,:inclusion=>{:in=>{}语法并重新部署。现在,我尝试在新的model1表单中选择该帐户,下拉列表不会显示以前创建的帐户的错误

因此,我创建了一个新帐户,并尝试为新帐户创建一个新的model1,验证失败再次出现

那么这就像是缓存问题?这是客户端验证问题吗?我尽我所能试图找出问题所在,但我对正在发生的事情一无所知

因此,每次我创建一个帐户时,它都希望我重新部署,这会扼杀应用程序的功能。我如何解决这个问题?不太清楚发生了什么

配置, 轨道3 部署在Heroku 使用资产管道

宝石: 客户端验证
Kaminari

目前,该语句在服务器启动后执行(正如您正确认识到的)。您需要将其包装在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)]}

它没有按您希望的那样工作,因为当Rails加载类时,
:in=>Account.find(:all.collect(&:id)
在生产模式下只对它进行了一次计算。我承认我不明白这样一个验证背后的原因。不管怎样,如果你真的想做到这一点,你必须使用a。

是的。我忘了提到可以使用proc或lamba。为了简单起见,我没有给出验证查询的全部逻辑:)好的,谢谢您对评估的指导。啊,好的。验证和范围的评估问题有时会让你发疯:)