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