我的模特
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! 端
我不知道为什么它失败了,尽管价值存在且正确。
答案 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
在验证过程中调用的函数之一。
所以每当我们尝试更新更新失败时,因为一旦验证被点击,它就会从数据库中重新加载原始值并忽略新值,如果旧值为空则只是一个令人头疼的问题。
感谢大家的帮助