Rails - Могу ли я показать разные партиалы в представлении после ошибки? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть приложение на Rails 5, в котором отображаются различные формы на основе параметров.Правильная форма показывается, когда представление впервые показывает

. Однако при возникновении ошибки всегда отображается один и тот же частичный элемент.

diary_controller

def edit
  @view = params[:view]
end

def update
  respond_to do |format|
    if @diary.update(diary_params)
      format.html { redirect_to @diary, notice: 'Diary was successfully updated.' }
      format.json { render :show, status: :ok, location: @diary }
    else
      format.html { render :edit }
      format.json { render json: @diary.errors, status: :unprocessable_entity }
    end
  end
end

edit.html.erb

<% if @view == 'close' %>
  <%= render 'close_fields'%>
<% elsif @view == 'new'%>
  <%= render 'new_fields' %>
<% else %>
  <%= render 'all_fields' %>
<% end %>

В настоящее время всегда отображается частичное 'all_fields' при возникновении ошибки.

Можно ли отобразить первоначально показанное частичное при сохранении данных, введенных пользователем в поля, вместе с сообщениями об ошибках (в настоящее время отображаются под текстовым полем, поскольку я использую simple_form)?

------------ ОБНОВЛЕНИЕ ------------

Когда я добавляю puts params[:view] в :edit, он возвращает close в консоли.

Когда я добавляю puts params[:view] в :update, в консоли ничего не возвращается.Я также попытался поставить @view = "close" в обновлении.Когда я сделал это, правильное представление было показано после ошибки.

Parameters: {"utf8"=>"✓", "authenticity_token"=>"f7JoOucLkUlOyt31NW9HaJIWyXKVSu7q91kspfZYjgdF3hJneRKapnCPtgJn+R5NOC5nDhNvkB8PzzHNs9aLkg==", "diary"=>{"last_date"=>"", "notes"=>"hi, hi!", "update_type"=>"close", "view"=>"close"}, "reason_list_select2"=>"going on vacation", "season_reason_list_select2"=>"", "temp_reason_list_select2"=>"", "area"=>[{"id"=>"4", "action"=>"Not Applicable"}], "commit"=>"Close Diary", "id"=>"27"}

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

В вашем diary_controller

before_action :load_view, only: [:edit, :update]

# Your action methods here

private

def load_view
  @view = params[:view]
end  

И убедитесь, что во всех ваших формах (close_fields, new_fields, all_fields) у вас есть скрытое поле с именем view, значение которого установлено в @ view.

0 голосов
/ 19 декабря 2018

Однажды попробуйте вот так в вашем
edit.html.erb

<% if @view.to_s == 'close' %>
 <%= render :partial => 'close_fields'%>
<% elsif @view.to_s == 'new'%>
 <%= render :partial => 'new_fields' %>
<% else %>
 <%= render :partial =>'all_fields' %>
<% end %>

Примечание: ваше частичное имя файла должно иметь такое подчеркивание: _all_fields.html.erb

0 голосов
/ 19 декабря 2018

В своем действии update вы никогда не устанавливаете @view, поэтому всегда nil, и в этом случае ваш оператор if... elsif... else всегда преобразуется в <%= render 'all_fields' %>.

Если вы хотите, чтобы ваш *Оператор 1008 * в edit.html.erb, чтобы разрешить что-то отличное от else, затем задайте переменную @view в своем действии update.

На основании обновления вашего вопроса проблема заключается в том, что:view вложено внутрь :diary:

"diary"=>{"last_date"=>"", "notes"=>"hi, hi!", "update_type"=>"close", "view"=>"close"}

Итак, вам нужно сделать @view = params[:diary][:view] вместо @view = params[:view].

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