Подтвердить что ты не робот

Обновить атрибуты для пользователя только в том случае, если атрибуты изменены

Оригинальная, счастливо работающая версия моего проекта выглядела так:

1) Пользователь заполняет форму (новое действие) и отправляет хиты (создавать действие)

2) Пользователь перенаправляется на свою страницу редактирования (для редактирования действия используется edit_id, созданный по модели, а не Rails auto-gen id), который показывает, что пользователь информации уже отправил

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

И добавив еще один компонент в "if":

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

Но это не работает. Теперь случается, что на странице редактирования, если я не изменю никакую информацию и не попаду в submit, ничего не произойдет (это здорово), но если я сделаю изменение информации и нажмите submit, все равно ничего не произойдет (что плохо). Что я делаю неправильно?

Примечание. Первоначально я думал, что это был порядок ошибок операций, поэтому я сделал его вложенным if, с первым, если @request.update_attributes, а второй, если @request.changed, но это тоже не сработало...

4b9b3361

Ответ 1

Метод update_attributes включает вызов "save" как часть его метода и возвращает true, если сохранение выполнено успешно. Я думаю, что вы ищете что-то вроде этого, используя assign_attributes:

def update
  @request = Request.find_by_edit_id(params[:edit_id])
  @request.assign_attributes(request_params)

  if @request.changed?
    if @request.save
      flash[:success] = true
      redirect_to edit_request_path(@request.edit_id)
    else
      render 'edit'
    end
  else
    # Action if no change has been made
  end
end