Вот мое решение всей сцены ошибки.
Я создал частичное, которое просто использует переменную модели, которую можно передать при рендеринге:
<%# app/views/errors/_error.html.erb %>
<%= content_for :message do %>
<% if model.errors.any? %>
<ul>
<% model.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
<% end %>
<% end %>
Вы можете легко добавлять динамические html-классы и / или имена идентификаторов, основанные как на имени модели, так и на общих.
У меня есть настройки, в которых мои сообщения об ошибках отображаются в одном и том же месте в файле макета:
<%# app/views/layouts/application.html.erb %>
<%= yield :message %>
Если кто-то не хочет этой функциональности, удаление content_for в частичном случае поможет.
Тогда на самом деле любой вид вы можете просто написать:
<%= render 'errors/error', model: @some_model %>
Можно дополнительно расширить это, создав частичное, которое принимает коллекцию и использует приведенную выше частичку ошибки:
<%# app/views/errors/_collection.html.erb %>
<% collection.each do |model| %>
<%= render 'errors/error', model: model %>
<% end %>
Сделать это с помощью:
<%= render 'errors/collection', collection: @some_model.some_has_many_association %>
Мне нравится этот способ. Он прост, легок в управлении / обслуживании и невероятно настраиваем.
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ: Все в HAML
-# app/views/errors/_error.html.haml
= content_for :message do
- if model.errors.any?
%ul
- model.errors.full_messages.each do |msg|
%li= msg
-# app/views/layouts/application.html.haml
= yield :message
= render 'errors/error', model: @some_model
-# app/views/errors/_collection.html.haml
- collection.each do |model|
= render 'errors/errors', model: @some_model
= render 'errors/_collection', collection: @some_model.some_has_many_association