【问题标题】:validates_inclusion_of Rails 3 with a query not working as expectedvalidates_inclusion_of Rails 3 查询未按预期工作
【发布时间】:2012-04-14 10:53:18
【问题描述】:

我是 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,验证失败再次出现。

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

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

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

宝石: 客户端验证 神成

【问题讨论】:

    标签: ruby-on-rails-3 validation activerecord client-side-validation


    【解决方案1】:

    它没有按您的意愿工作,因为 :in =&gt; Account.find(:all).collect(&amp;:id) 在生产模式下仅评估一次,此时 Rails 加载该类。我承认我不明白这种验证背后的原因。无论如何,如果你真的想达到这个目的,你必须使用custom validator

    【讨论】:

    • 为了简单起见,我没有给出验证查询的整个逻辑 :) 非常感谢您对评估的提醒。
    • 嗯,好的。验证和范围的评估问题有时会让你发疯:)
    【解决方案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)]}
    

    【讨论】:

    • 是的。我忘了提到可以使用 proc 或 lamba。
    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 2011-05-29
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多