Ruby on rails 实现ActiveModel脏Rails 3.2.8时出现的问题

Ruby on rails 实现ActiveModel脏Rails 3.2.8时出现的问题,ruby-on-rails,Ruby On Rails,我想检查模型上的属性何时更改。我已尝试检查值!=保存前表单上的值,但该代码非常难看,有时无法正常工作。与使用update_列相同,update_列不在我的模型类中进行验证。如果我在没有做其他事情的情况下使用update_属性,我将无法根据我的理解检查字段何时被更新。从我对Stack Overflow和其他网站的web研究来看,使用ActiveModel Dirty似乎是一条可行之路 我已经看过了: 我希望用它来检查在使用update\u属性之后,模型上的布尔标志是否发生了变化。我尝试按照包含的链

我想检查模型上的属性何时更改。我已尝试检查值!=保存前表单上的值,但该代码非常难看,有时无法正常工作。与使用update_列相同,update_列不在我的模型类中进行验证。如果我在没有做其他事情的情况下使用update_属性,我将无法根据我的理解检查字段何时被更新。从我对Stack Overflow和其他网站的web研究来看,使用ActiveModel Dirty似乎是一条可行之路

我已经看过了:

我希望用它来检查在使用update\u属性之后,模型上的布尔标志是否发生了变化。我尝试按照包含的链接中所述的最低限度实现。我在ActiveRecord类中添加了以下内容:

include ActiveModel::Dirty

define_attribute_methods [:admin]
我尝试添加我想要跟踪的三个属性。我从一个属性开始,看看是否可以让它工作。我在运行rspec测试时收到以下错误。一旦我删除了这个论点,我就没有错误了

Exception encountered: #<ArgumentError: wrong number of arguments (1 for 0)>
遇到异常:# 删除参数后,我决定在模型中使用admin而不是name包含类似的方法。其他Rspec测试在save方法上失败。然而,我觉得问题在于如何实现ActiveModel

我在其他的堆栈溢出帖子上读到过,有评论说3.2.8中包含了堆栈溢出,所以我从3.2.6升级到了3.2.8。我不明白这意味着什么,所以在出现错误后,我决定只保留include-ActiveModel::Dirty语句,并尝试使用admin\u changed?当然没有用

除了我在这里包含的链接之外,我还没有找到任何关于如何为此设置初始设置的内容。我发现的所有其他研究都假设初始设置是正确的,并且更新到Rails的当前稳定版本可以解决问题


对于如何实施这一点,我们将不胜感激。按照链接中的说明执行最低限度的实现是不起作用的。可能我还缺少其他东西。

尝试添加=,如下所示:

define_attribute_methods = [:admin]
require 'active_record/nonpersisted_attribute_methods'
class Foo < ActiveRecord::Base
  include ActiveRecord::NonPersistedAttributeMethods
  define_nonpersisted_attribute_methods [:bar]
end

foo = Foo.new
foo.bar = 3
foo.bar_changed? # => true
foo.bar_was # => nil
foo.bar_change # => [nil, 3]
foo.changes[:bar] # => [nil, 3]

这种改变对我起了作用。不确定是否与此有关?

问题似乎是ActiveRecord重新定义了
define_attribute_methods
方法以接受0个参数(因为ActiveRecord会自动为数据库表中的每一列创建属性方法):

这将覆盖ActiveModel提供的
define\u attribute\u methods
方法:

解决方案:

我找到了一个适合我的解决方案

将此文件另存为
lib/active\u record/nonpersisted\u attribute\u methods.rb

然后你可以这样做:

define_attribute_methods = [:admin]
require 'active_record/nonpersisted_attribute_methods'
class Foo < ActiveRecord::Base
  include ActiveRecord::NonPersistedAttributeMethods
  define_nonpersisted_attribute_methods [:bar]
end

foo = Foo.new
foo.bar = 3
foo.bar_changed? # => true
foo.bar_was # => nil
foo.bar_change # => [nil, 3]
foo.changes[:bar] # => [nil, 3]
所以我不知道在Rails 4中,这种方法是否会中断或变得更难

另见:


KH941,在我发布这个问题后不久,我决定写下模型和视图之间的比较,因为我的项目还有一个最后期限要很快完成。逻辑运作良好。我昨天决定按照建议更改define\u attribute\u methods语句。我能够将我想要跟踪的方法添加到语句中,没有错误。然而,当我从link开始简单的实现时,我的许多自动测试都失败了。我决定在这一点上放弃使用ActiveDirty,因为我的比较逻辑是有效的。对于正在工作的应用程序来说,这太麻烦了。define_attribute_methods=[:admin]将设置名为define_attribute_methods的局部变量。那不是你想要的。您想从ActiveModel调用类级方法define_attribute_方法。您提供的链接表明,他们为了修复打字错误而删除了“=”。也许您应该更新您的答案,这样人们就不必查看注释来注意您的打字错误了?:)Tyler我正在为我所有的Rails 3应用程序创建Rails 4版本。我已经决定在我的网站的其他功能工作后再看看这个。我已经添加了很多布尔值,因此尝试实现ActiveModel::Dirty是有意义的。希望Rails4能让这个过程变得更简单。在继续之前,我可能会检查一下。非常感谢您发布您的解决方案。如果我成功地实施了它,我将接受你的回答。