3

我对 Rails 很陌生,我正面临一个问题。我有

楷模

Model1
id: integer
account_id: integer

Account
id: integer

我在 Model1 中进行了如下验证,

型号代码:

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 来部署我的应用程序。

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

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

然后我创建了一个新帐户并尝试为新帐户创建一个新模型1,验证失败再次出现。

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

所以每次我创建一个帐户时,它都希望我重新部署它会杀死应用程序的功能。我该如何摆脱这个问题?不太确定发生了什么。

在 Heroku 中部署的 Config、Rails 3 使用资产管道

Gems:客户端验证 Kaminari

4

2 回答 2

2

目前,一旦服务器启动,该语句就会被执行(正如您正确意识到的那样)。您需要将其包装在 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)]}
于 2012-04-14T10:58:20.483 回答
2

它没有按您的意愿工作,因为 :in => Account.find(:all).collect(&:id)它在生产模式下只评估一次,当 Rails 加载类时。我承认我不明白这种验证背后的原因。无论如何,如果你真的想实现这一点,你必须使用自定义验证器。

于 2012-04-14T10:58:21.713 回答