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

标签 ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我最近注意到 ActiveRecord 对象上的方法 changed? 在 Rails 3.2.13 和 Rails 4.0.1 之间发生了变化。问题在于连接到数据库中整数字段的字段。假设我的模型 Model 带有 number 整数字段:

# Rails 3.2.13

m = Model.last
m.number                #=> 5
m.number = '5hello'
m.number                #=> 5
m.number_changed?       #=> true
m.changed?              #=> true
m.changes               #=> {:number => [5,5]}

# Rails 4.0.1

m = Model.last
m.number                #=> 5
m.number = '5hello'
m.number                #=> 5
m.number_changed?       #=> false
m.changed?              #=> false
m.changes               #=> {}

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

我已经设法通过将 number_changed? 方法覆盖到 super || 来解决这个问题number.to_s != number_before_type_cast,但这非常难看。

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

最佳答案

我不确定您是如何运行验证的,但我的 Rails 应用程序中有一个名为 ExtraField 的模型,并且具有以下验证:

class ExtraField < ActiveRecord::Base

  # stuff

  validates :display_order, numericality: { only_integer: true }

  # more stuff

end

我使用的是 rails 4.0.5,我可以执行以下操作:

e = ExtraField.first
e.display_order           #=> 1
e.valid?                  #=> true
e.errors.messages         #=> {}
e.display_order = '1banana'
e.display_order           #=> 1
e.display_order_changed?  #=> false
e.changed?                #=> false
e.valid?                  #=> false
e.errors.messages         #=> {:display_order=>["is not a number"]}

因此,虽然记录确实没有标记为已更改(恕我直言,这似乎是正确的),但我仍然可以运行我的验证并检查模型是否有效。在我看来这不像是一个错误,而只是一个有意的改进。

如果您的表单仅验证模型是否响应 true changed?,也许您应该检查您的 Controller 代码。或者,如果您使用 gem 来帮助构建表单,我猜它可能是该 gem 中的错误。

关于ruby-on-rails - Rails 3.2.13 与 Rails 4.0.1 - 改变了吗?方法变了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23043346/

相关文章:

ruby-on-rails - ruby rails : Getting undefined method using array with name in my select tag

ruby - 如果 block 从不更改累加器,为什么 reduce 不返回初始值?

jquery - 在 jquery 对话框中使用 Rails 部分

sql - 尝试为自日期 x 以来的记录创建 Rails 模型范围查询,使用 lambda?

ruby-on-rails - Rails Rspec 套件有故障,但在单独运行时通过

ruby-on-rails - 无法为数据库添加种子;由于连接被拒绝而无法工作?

mysql - Rails 在架构加载时损坏二进制字段默认值

ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像

ruby-on-rails-3 - will_paginate 3.0.3 和 data-remote

javascript - rails 4 : asset pipeline (javascripts) routing error