Ruby On Rails-повторное использование частичного представления сообщения об ошибке

Я пытался повторно использовать блок сообщения об ошибке в моих представлениях.

ниже был блок, написанный в positions / _error_messages.формат html.Эрб

<% if @position.errors.any? %>
  <div id="error_explanation">
   <div class="alert alert-error">
     The form contains <%= pluralize(@position.errors.count, "error") %>.
   </div>
   <ul>
    <% @position.errors.full_messages.each do |msg| %>
    <li>* <%= msg %></li>
   <% end %>
   </ul>
 </div>
<% end %>

проблема заключалась в том, что я должен был создать подобное частичное представление в каждой модели, которая является своего рода повторением одного и того же кода с другим объектом, т. е. @user, @client и т. д.

Remedy

Я создал один erb в общей папке shared/_error_messages.формат html.erb и написал ниже код.

<% def error_message(active_object) %>
 <% if active_object.errors.any? %>
  <div id="error_explanation">
   <div class="alert alert-error">
    The form contains <%= pluralize(active_object.errors.count, "error") %>.
   </div>
   <ul>
    <% active_object.errors.full_messages.each do |msg| %>
     <li>* <%= msg %></li>
    <% end %>
   </ul>
  </div>
 <% end %>
<% end %>

, а затем в виде файла. должности/новые.формат html.erb я написал ниже код

<div id="errorbox"> 
 <%= render "shared/error_messages" %>
 <%= error_message(@position) %>
</div>

это означает, что теперь я могу использовать тот же код во всех моих действиях Create и Update.

я хочу знать, это правильный способ сделать это? Или есть другой вариант?

3 ответов


нет, определение методов в представлениях не является правильным способом сделать это. Я думаю, вам лучше заменить @position из вашего первого частичного с локальной переменной, названной более общим способом, например object и сделать это частичное с:

<%= render 'shared/error_messages', object: @position %>

который передает @position как локальную переменную object к частичному.


<%= render partial: 'shared/error_messages', locals: {position: @position} %>

Теперь в вашем частичном _error_messages.html.erb в общей папке, вы можете использовать position переменной.

см.http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html для получения дополнительной помощи.


это не лучший способ сделать это. замените @position чем-то более общим, например " obj " (в качестве примера) в вашем первом блоке кода. Так это будет выглядеть вот так.

<% if obj.errors.any? %>
<div id="error_explanation">
<div class="alert alert-error">
The form contains <%= pluralize(obj.errors.count, "error") %>.
</div>
<ul>
<% obj.errors.full_messages.each do |msg| %>
<li>* <%= msg %></li>
<% end %>
 </ul>
</div>
<% end %>

все, что вы сделали, это заменили @position на obj. Теперь возьмите приведенный выше код и поместите его в общую папку как '_error_messages.формат html.erb'

теперь для каждого файла, где вам нужны сообщения об ошибках, вы можете отобразить частичный и заменить obj любой переменной экземпляра, используемой в этот файл. (на этом этапе вы замените любой код сообщения об ошибке в ваших файлах кодом ниже, в зависимости от используемой переменной экземпляра. примеры ниже) в позиции:

<%= render 'shared/error_messages', obj: @position %>

пользователь:

<%= render 'shared/error_messages', obj: @user %>

клиент:

<%= render 'shared/error_messages', obj: @client %>

etc... obj: @client #или любая переменная экземпляра выключает " obj " частичного и помещает переменную экземпляра в его место. Надеюсь, это поможет!