Was ist die bevorzugte Art, Validierungsfehlermeldungen mit form_for
in Rails 4 anzuzeigen?
<%= form_for @post do |f| %>
...
<% end %>
Wie bei Rails 3 - siehe f.error_messages in Rails 3.0 oder http://railscasts.com/episodes/211-validations-in-Rails-3 für viele verschiedene Möglichkeiten.
Meine persönliche Präferenz ist es, simple_form zu verwenden und den Fehler neben die Eingabe zu setzen.
So zeige ich sie für mein Formularobjekt namens @location:
an
<% if @location.errors.any? %>
<ul>
<% @location.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
<% end %>
Hinweis: Fügen Sie den obigen Code nach der <%= form_for @location do |f| %>
-Zeile ein
Meine bevorzugte Art, dies zu tun und den Code einfach und trocken zu halten, ist der folgende:
Erstellen Sie einen neuen Helfer in application_helper.rb
# Displays object errors
def form_errors_for(object=nil)
render('shared/form_errors', object: object) unless object.blank?
end
Erstellen Sie ein neues freigegebenes Partial in shared/_form_errors.html.erb
<% content_for :form_errors do %>
<p>
<%= pluralize(object.errors.count, "error") %> prevented the form from being saved:
</p>
<ul>
<% object.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
Bearbeiten Sie Ihre application.html.erb -Datei, um die Fehler dort aufzunehmen, wo Sie sie möchten:
<%= yield :form_errors %>
Platzieren Sie schließlich den Helfer am Anfang jedes Formulars:
<%= form_for(@model) do |f| %>
<%= form_errors_for @model %>
<%# ... form fields ... %>
<% end %>
Dies macht es extrem einfach, Ihre Formularfehler in vielen Formularen zu verwalten und anzuzeigen.
Ich weiß, dass dies nicht genau das ist, was gefragt wurde, aber wenn Sie das simple_form Gem verwenden, das ich empfehle, können Sie f.error_notification verwenden, was: message als Option verwendet.
= f.error_notification message: form_errors_for(your_object)
Ich verwende eine Methode, die der Antwort von Wes ziemlich ähnlich ist. form_errors_for inside application_helper.rb
def form_errors_for_base(object)
if object.errors.messages[:base].present?
object.errors.messages[:base].join(",\n") + "."
else
nil
end
end