web-dev-qa-db-de.com

form_für Fehlermeldungen in Ruby on Rails

Was ist die bevorzugte Art, Validierungsfehlermeldungen mit form_for in Rails 4 anzuzeigen?

<%= form_for @post do |f| %>
  ...
<% end %>
12
Kyle Decot

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.

8
Jesse Wolgamott

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

28
Danny

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.

12
Wes Foster

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
0
jlesse