【发布时间】:2014-11-29 20:38:06
【问题描述】:
在控制器更新中更改模型的属性时,我想生成即将进行的更改的历史记录。为此,我创建了一个方法 generate_history 从实例访问。
班级:
class Assist < ActiveRecord::Base
belongs_to: status
def generate_history
#Also tried without self
p 'Testing round two'
p 'Status' + self.status.id.to_s
p 'Modified: ' + self.status.id_changed?.to_s
p 'Old value ' + self.status.id_was.to_s
#do something something dark side
end
end
问题在于该方法,ActiveModel::Dirty 不知道所做的更改,尽管self.status_id 的值是新值。
同时在控制器中:
def update
...
@assist.assign_attributes(assist_params)
p 'Testing round one'
p 'Status' + @assist.status_id.to_s
p 'Modified: ' + @assist.status_id_changed?.to_s
p 'Old value ' + @assist.status_id_was.to_s
p 'Generating history'
@assist.generate_history
p 'Testing round three'
p 'Status' + @assist.status_id.to_s
p 'Modified: ' + @assist.status_id_changed?.to_s
p 'Old value ' + @assist.status_id_was.to_s
end
起初我怀疑assign_attributes 会以某种方式干扰ActiveModel::Dirty,但我意识到ActiveModel::Dirty 在控制器中工作,其中值正在被修改,但不是在我调用generate_history 时.
我是在实例方法中做错了什么,还是 ActiveModel::Dirty 的工作方式有问题?
输出示例:
Testing round one
Status 1
Modified: true
Old value 2
Generating history
Testing round two
Status 1
Modified: false
Old value 1
Testing round three
Status 1
Modified: true
Old value 2
【问题讨论】:
-
您是否尝试过通过
status属性查找“脏”?而不是.status_id,请尝试.status.id和.status_changed?。它可能会起作用...... -
@mr-rogers
.status.changed?在方法内报告错误 -
伤心。不错,值得一试。
-
@mr-rogers 实际上,你是对的。我在 generate_history 方法中有 .status.id 和 .status.id.changed? (报告没有修改)当我测试 .status_id.changed 的输出时?在控制器中。你能把它作为答案吗?
-
当然。很高兴这有帮助。让我知道发布的答案是否与您的工作相符。我吐了……
标签: ruby-on-rails ruby-on-rails-4 activerecord activemodel