首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails 3检查属性是否已更改

Rails 3检查属性是否已更改
EN

Stack Overflow用户
提问于 2011-02-19 21:54:57
回答 3查看 120.2K关注 0票数 157

在Rails 3中更新之前,需要检查属性块是否发生了更改。

street1、street2、城市、州、邮政编码

我知道我需要像这样的东西

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

但这段代码会很长。有没有更干净的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-19 21:58:00

查看ActiveModel::Dirty (默认情况下在所有型号上都可用)。文档确实很好,但它允许您执行以下操作:

@user.street1_changed? # => true/false
票数 289
EN

Stack Overflow用户

发布于 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

如果你正在尝试检测大量的属性变化,那么它可能会变得混乱。也许不应该在控制器中这样做,但是。

票数 14
EN

Stack Overflow用户

发布于 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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5051135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档