3

我们正在从 rails 2.3 升级到 rails 3,并且我们对以下模型进行了一些验证:

validates_length_of :corporate_type,  :in => 1..255, :allow_blank => false, :on => :update, :if => Proc.new { |rra| rra.show_corporate_type? }

在 Rails 2.3 中,这只在更新时调用,但在 Rails 3 中,它似乎在创建时调用,这会破坏下游的一些东西......有人可以解释为什么在创建时调用它吗?

这是堆栈:

app/models/rra_agreement.rb:11:in `block in <class:RRAAgreement>'

app/models/foo_application_delegate.rb:29:in `create_application'

第 28 和 29 行是:

rra = RRAAgreement.new()
rra.save

第 11 行是上面的验证行

谢谢乔尔

4

3 回答 3

1

我会尝试使用以下方法:new_record?

validates :corporate_type, :unless => :new_record?

新记录?如果刚刚创建,则返回 true,否则返回 false。

于 2012-10-08T14:46:48.983 回答
0

好吧,我有一个解决方法,它很难看,但它似乎至少让我们继续前进:

 validates_length_of :corporate_type,  :in => 1..255, :allow_blank => false, :on => :update, :if => Proc.new { |rra| return false if rra.id==nil;rra.show_corporate_type? }

如果 id 不存在,这只是错误的,它应该在更新时存在。

于 2012-10-08T12:09:52.367 回答
0

rails 3 的语法已更改,尝试仅在更新时调用,

validates :corporate_type,:length => {:on => :update, :min => 1, :max => 20 } 
于 2012-10-10T12:05:07.183 回答