尽管值正确,update_attributes验证失败

时间:2017-11-15 20:47:16

标签: ruby-on-rails

我的模特

class Account < ActiveRecord::Base
 validates_length_of :amount, :in 1..255, :on => update, :if => Proc.new { |a| false if a.id == nil;a.amount.blank? }
 validates_length_of :name, :in 1..255, :on => update, :if => Proc.new { |a| false if a.id == nil;a.name.blank? }, :unless => user_has_amount?

end 

当我注释掉if条件时,它工作正常,但是验证失败,这令人困惑。我知道只有在proc返回true或者返回false时才会运行验证 在我的控制器中我有

@account.update_attributes({:name => "king", :amount => "1223"}

保存失败,当我检查错误时,我

@account.errors.details
{:name =>[{:error=>:too_short, :count=>1}], :amount =>[{:error=>:too_short, :count=>1}]}

强有力的参数不是问题,因为我有      def self.params           params.require(:帐户).permit!      端

我不知道为什么它失败了,尽管价值存在且正确。

3 个答案:

答案 0 :(得分:0)

尝试以下方法:

class Account < ActiveRecord::Base
    validates :amount, length: { in: 1..255 }, on: :update
    validates :name, length: { in: 1..255 }, on: :update
end

答案 1 :(得分:0)

检查您的强参数。在进行验证之前,您的错误告诉您出现了问题::name =>[{:error=>:too_short, :count=>1}]这表示最小字符串计数为1,但您的字符串甚至不长。 Here is the docs on that.

您可以尝试:Account.find(1).update_attributes({:name => "king", :amount => "1223"}查看@account是否设置不正确。

您还可以自定义错误语言以进一步提供帮助:

validates_length_of : name, within: 1..255, too_long: 'pick a shorter name', too_short: 'pick a longer name'

答案 2 :(得分:0)

正在发生的问题有一个原因。代码继承自具有以下内容的类:

slef.reload 

在验证过程中调用的函数之一。

所以每当我们尝试更新更新失败时,因为一旦验证被点击,它就会从数据库中重新加载原始值并忽略新值,如果旧值为空则只是一个令人头疼的问题。

感谢大家的帮助