Обновлять атрибуты для пользователя, только если атрибуты изменились
Оригинальная, счастливо работающая версия моего проекта выглядела так:
1) Пользователь заполняет форму (новое действие) и нажимает отправить (создать действие)
2) Пользователь перенаправляется на свою страницу редактирования (действие редактирования использует edit_id, созданный моделью, а не идентификатор автоматического создания Rails), которое показывает информацию, которую пользователь уже отправил
3) Пользователь может изменить информацию (обновить действие) и повторно отправить
В этой версии, даже если пользователь ничего не меняет на странице редактирования и отправляет сообщение, на странице все равно будет отображаться предупреждение об успехе.
С точки зрения базы данных мне все равно, потому что, поскольку форма предварительно заполнена информацией о пользователе, метод update_attributes просто переопределяет старую информацию той же самой информацией.
Однако, с точки зрения пользователя, это раздражает, поэтому я хочу убедиться, что информация обновляется, а предупреждение об успехе мигает только в том случае, если пользователь действительно что-то меняет.
Я думал, что это будет действительно легко, изменив старый код из этого:
def update
@request = Request.find_by_edit_id(params[:edit_id])
if @request.update_attributes(request_params)
flash[:success] = true
redirect_to edit_request_path(@request.edit_id)
else
render 'edit'
end
end
И добавление еще одного компонента к «если», как это:
def update
@request = Request.find_by_edit_id(params[:edit_id])
if @request.update_attributes(request_params) && @request.changed?
flash[:success] = true
redirect_to edit_request_path(@request.edit_id)
else
render 'edit'
end
end
Но это не работает. Теперь происходит то, что на странице редактирования, если я не изменяю какую-либо информацию и не нажимаю кнопку «Отправить», ничего не происходит (и это здорово), но если я действительно изменяю информацию и нажимаю «Отправить», все равно ничего не происходит (что плохо). Что я делаю неправильно?
Примечание. Сначала я подумал, что это ошибка порядка операций, поэтому я сделал ее вложенной, если: сначала if @ request.update_attributes, а затем второй if @ request.changed, но это тоже не сработало ...