Rails: проверка измененных полей
Во-первых, я создал эшафот под названием "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
Атрибуты, которые не были сохранены, будут соответствовать 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