在Rails 3中更新之前,需要检查属性块是否发生了更改。
street1、street2、城市、州、邮政编码
我知道我需要像这样的东西
if @user.street1 != params[:user][:street1]
then do something....
end
但这段代码会很长。有没有更干净的方法?
发布于 2011-02-19 21:58:00
查看ActiveModel::Dirty (默认情况下在所有型号上都可用)。文档确实很好,但它允许您执行以下操作:
@user.street1_changed? # => true/false
发布于 2014-02-05 05:56:52
ActiveModel::Dirty
对我不起作用,因为@model.update_attributes()
隐藏了这些更改。所以这就是我如何在控制器的update
方法中检测到它的变化:
def update
@model = Model.find(params[:id])
detect_changes
if @model.update_attributes(params[:model])
do_stuff if attr_changed?
end
end
private
def detect_changes
@changed = []
@changed << :attr if @model.attr != params[:model][:attr]
end
def attr_changed?
@changed.include :attr
end
如果你正在尝试检测大量的属性变化,那么它可能会变得混乱。也许不应该在控制器中这样做,但是。
发布于 2018-05-17 19:47:17
上面的答案更好,但对于知识,我们还有另一种方法,让我们为对象(@design)更改'catagory‘列值,
@design.changes.has_key?('catagory')
.changes将返回一个散列,其中key作为列名,values作为数组,每列有两个值old_value和new_value。例如,上面的目录从@design的'ABC‘改为'XYZ’,
@design.changes # => {}
@design.catagory = 'XYZ'
@design.changes # => { 'catagory' => ['ABC', 'XYZ'] }
对于参考change in ROR
https://stackoverflow.com/questions/5051135
复制相似问题