Rails 3检查属性是否改变

在Rails 3更新之前,需要检查一个属性块是否已经改变。

街道1,街道2,城市,州,邮政编码

我知道我可以使用类似的东西

if @user.street1 != params[:user][:street1] then do something.... end 

但是这段代码将是非常长的。 有更清洁的方法吗?

查看ActiveModel :: Dirty (默认情况下在所有模型上都可用)。 文档非常好,但它可以让你做的事情,如:

 @user.street1_changed? # => true/false 

这就是我解决检查多个属性变化的问题。

 attrs = ["street1", "street2", "city", "state", "zipcode"] if (@user.changed & attrs).any? then do something.... end 

changed方法返回为该对象更改的属性的数组。

@user.changedattrs都是数组,所以我可以得到交集(参见ary & other ary方法)。 交集的结果是一个数组。 通过调用any? 在数组上,如果至less存在一个交点,则为真。

changed_attributes方法也是非常有用的,它返回属性的散列值和原始值,并且这些changes返回属性与它们的原始值和新值(在数组中)的哈希值。

您可以检查支持这些方法的版本的APIDock。

http://apidock.com/rails/ActiveModel/Dirty

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 

如果你试图检测到很多属性的变化,它可能会变得混乱。 可能不应该在控制器中这样做,但是呃。