Rails:检查修改的字段

16

首先,我已经生成了名为“item”的脚手架。

我想检查哪些字段被修改了。我尝试了两种可能的方法,但它们都没有起作用。

第一次尝试!

def edit
  @item = Item.find(params[:id])
  @item_before_update = @item.dup
end

def update
  @item = Item.find(params[:id])
  # compare @item_before_update and @item here, but @item_before_update is NIL !!!
end

第二次尝试!我在寻找从视图到控制器传递数据的方法,但是我找不到。

edit.html.erb
<% @item_before_update = @item.dup %> # I thought @item_before_update can be read in update method of item controller. But NO.
<% params[:item_before_update] = @item.dup %> # And I also thought params[:item_before_update] can be read in update mothod of item controller. But AGAIN NO

<% form_for(@item) do |f| %>
# omitted
<% end %>

请告诉我如何解决这个问题 :(

1个回答

42

未持久化更改的属性将响应 changed? 为真

@item.title_changed? #=> true
你可以通过使用 changed 获取已更改属性的数组。
@item.changed #=> ['title'] 

对于您的#update动作,您需要使用attributes=来更改对象,然后您可以在持久化之前使用changedchanged?

def update
  @item = Item.find(params[:id])
  @item.attributes = params[:item]
  @item.changed #=> ['title']
  ... do stuff
  @item.save
end

这很酷,但在项目控制器的更新操作中无法工作。出了什么问题? - Hongseok Yoon
我添加了一个更新方法的示例。它没有起作用的原因是你从数据库中检索了@item,所以它没有被更改。然后,您需要使用提交表单中的参数更新它,然后可以获取“已更改”状态,并在需要时进行持久化。 - Ben
1
我认为上面的代码一定是Rails 3。在Rails 2中,您可以通过以下方式检查属性是否已更改:@item.title_changed?(请参阅http://archives.ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects) - Paul Lynch
不好意思,changed? 只为您的模型实例定义,而不是为您的属性(即整数、字符串等)定义。截至 Rails 3.2.3,您仍需要使用 @object.attribute_changed? 来执行每个属性检查。http://api.rubyonrails.org/classes/ActiveModel/Dirty.html - jibiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接