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 " частичного и помещает переменную экземпляра в его место. Надеюсь, это поможет!