ruby-on-rails – Rails 3.2.13 vs Rails 4.0.1 – 改变了吗?方法改变了?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails 3.2.13 vs Rails 4.0.1 – 改变了吗?方法改变了?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近注意到方法改变了?在Rails 3.2.13和Rails 4.0.1之间的ActiveRecord对象上已经发生了变化.问题是连接到数据库中的整数字段的字段.假设我有一个带有数字整数字段的模型模型:
  1. # Rails 3.2.13
  2.  
  3. m = Model.last
  4. m.number #=> 5
  5. m.number = '5hello'
  6. m.number #=> 5
  7. m.number_changed? #=> true
  8. m.changed? #=> true
  9. m.changes #=> {:number => [5,5]}
  10.  
  11. # Rails 4.0.1
  12.  
  13. m = Model.last
  14. m.number #=> 5
  15. m.number = '5hello'
  16. m.number #=> 5
  17. m.number_changed? #=> false
  18. m.changed? #=> false
  19. m.changes #=> {}

这会导致表单验证出现一些非常烦人的问题 – 如果用户试图将整数值更改为无效字符(但类型转换将导致与初始值相同的值),rails将不会调用save方法而且没有验证(包括数字:{only_integer:true})将运行.

我设法通过覆盖number_changed来解决这个问题?超级||的方法number.to_s!= number_before_type_cast,但这非常难看.

问题是:为什么这会改变?这是一个错误还是故意改变?如何在不覆盖整数列的所有元方法的情况下修复它?

解决方法

我不确定你是如何运行验证的,但我在我的rails应用程序上有一个名为ExtraField的模型,并进行以下验证:
  1. class ExtraField < ActiveRecord::Base
  2.  
  3. # stuff
  4.  
  5. validates :display_order,numericality: { only_integer: true }
  6.  
  7. # more stuff
  8.  
  9. end

我正在使用rails 4.0.5,我可以执行以下操作:

  1. e = ExtraField.first
  2. e.display_order #=> 1
  3. e.valid? #=> true
  4. e.errors.messages #=> {}
  5. e.display_order = '1banana'
  6. e.display_order #=> 1
  7. e.display_order_changed? #=> false
  8. e.changed? #=> false
  9. e.valid? #=> false
  10. e.errors.messages #=> {:display_order=>["is not a number"]}

所以,虽然记录确实没有标记为已更改(看似正确的恕我直言),但我仍然可以运行我的验证并检查模型是否无效.对我来说看起来不是一个错误,但只是一个有意识的改进.

如果您的表单仅验证模型是否响应更改?也许你应该检查你的控制器代码.或者,如果您使用宝石来帮助构建表单,我猜这可能是宝石中的错误.

猜你在找的Ruby相关文章