2010-02-03 57 views
13

首先,我已經生成了一個名爲'item'的腳手架Rails:檢查修改後的字段

我想檢查該項目的哪些字段被修改。我已經嘗試了兩次可能的嘗試,那些都不行。

第一次嘗試!

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 %> 

請讓我知道如何解決這個問題:(

回答

28

屬性有沒有被堅持將應對真實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 
+0

這是很酷,但在項目控制器的更新操作無法正常工作。怎麼了? – 2010-02-03 08:48:17

+0

我已經添加了一個示例更新方法。它不工作的原因是您從數據庫中檢索了@item,因此沒有更改。然後,您需要使用提交表單中的參數對其進行更新,然後您可以獲得「更改」狀態,如果您願意,可以堅持。 – Ben 2010-02-03 09:08:23

+1

我認爲上面的必須是Rails 3.在Rails 2中,你可以檢查屬性是否改變了,如:@ item.title_changed ?. (請參閱http://archives.ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects) – 2012-02-27 22:51:06