Rails: проверка измененных полей - PullRequest
13 голосов
/ 03 февраля 2010

Во-первых, я создал скаффолд с именем '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 Ответ

31 голосов
/ 03 февраля 2010

Атрибуты, у которых есть изменения, которые не были сохранены, будут соответствовать true на changed?

@item.title_changed? #=> true

Вы можете получить массив измененных атрибутов, используя changed

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

Для вашего действия #update вам необходимо использовать attributes= для изменения объекта, затем вы можете использовать changed и changed? перед сохранением:

def update
  @item = Item.find(params[:id])
  @item.attributes = params[:item]
  @item.changed #=> ['title']
  ... do stuff
  @item.save
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...