2010-02-03 29 views
13

Đầu tiên, tôi đã tạo giàn giáo được gọi là 'item'Đường ray: kiểm tra các trường đã sửa đổi

Tôi muốn kiểm tra xem các trường nào của mục được sửa đổi. và tôi đã thử hai lần cố gắng, đó không phải là việc làm.

Nỗ lực đầu tiên!

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 

Nỗ lực thứ hai! Tôi đã tìm cách chuyển dữ liệu từ chế độ xem sang bộ điều khiển và tôi không thể. 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 %> 

Xin vui lòng cho tôi biết làm thế nào để giải quyết vấn đề này :(

Trả lời

28

Thuộc tính có thay đổi chưa được vẫn kiên trì sẽ trả lời đúng với changed?

@item.title_changed? #=> true 

Bạn có thể nhận được một loạt các thuộc tính đã thay đổi bằng cách sử dụng changed

@item.changed #=> ['title'] 

Đối với hành động #update của bạn, bạn cần phải sử dụng attributes= để thay đổi các đối tượng, sau đó bạn có thể sử dụng changedchanged? trước sự bền bỉ:

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

Đây là mát mẻ, nhưng không hoạt động trong bản cập nhật hoạt động của bộ điều khiển mục. Chuyện gì vậy? –

+0

Tôi đã thêm phương pháp cập nhật mẫu. Lý do nó không hoạt động là bạn đã truy xuất @item từ cơ sở dữ liệu, do đó nó không bị thay đổi. Sau đó, bạn cần phải cập nhật nó với các thông số của bạn từ biểu mẫu đã gửi, sau đó bạn có thể nhận trạng thái 'đã thay đổi' và tiếp tục tồn tại nếu bạn muốn. – Ben

+1

Tôi nghĩ rằng ở trên phải là Rails 3. Trong Rails 2, bạn có thể kiểm tra xem một thuộc tính đã được thay đổi như thế nào: @ item.title_changed ?. (Xem http://archives.ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects) –

Các vấn đề liên quan