Ruby на Rails - повторная визуализация формы при неудачном действии контроллера с исходными параметрами - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть контроллер, который выглядит следующим образом:

def update
  @expense_report = ExpenseReport.find(params[:id])
  @expense_report.status = "Submitted"

  respond_to do |format|
    if @expense_report.update(expense_report_params)
      ...
      ...
    else
      format.html { render :edit }
      ...
    end
  end 
end

Я пытаюсь установить состояние до обновления, чтобы я мог уменьшить количество выполненных сохранений. Я бы предпочел только одно сохранение. Однако, когда форма повторно отображается при неудачном сохранении, она повторно отображается с исходными параметрами И состоянием, установленным на «Передано», даже если «Отправлено» не было одним из исходных параметров. Есть ли способ визуализации только с оригинальными параметрами?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

@artur.prado находится на правильном пути с его ответом , но отсутствует переназначение предоставленных пользователем параметров. Я превратил это в отдельный ответ, потому что изменение его ответа полностью изменило бы написанное им и могло бы go вопреки его намерениям.

Вы можете восстановить версию базы данных с помощью restore_attributes, затем повторно примените представленные изменения с assign_attributes.

def update
  @expense_report = ExpenseReport.find(params[:id])
  @expense_report.status = "Submitted"

  respond_to do |format|
    if @expense_report.update(expense_report_params)
      # ...
    else
      @expense_report.restore_attributes
      @expense_report.assign_attributes(expense_report_params)

      format.html { render :edit }
      # ...
    end
  end 
end
1 голос
/ 17 апреля 2020

В Rails 4.2 введено именно то, что вам нужно. В блоке else просто вызовите

@expense_report.restore_attributes

перед рендерингом представления. Это сделает свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...