web-dev-qa-db-fra.com

form_for messages d'erreur dans Ruby on Rails

Quelle est la méthode préférée pour afficher les messages d'erreur de validation à l'aide de form_for dans Rails 4?

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

Identique à Rails 3 - voir f.error_messages dans Rails 3.0 ou http://railscasts.com/episodes/211-validations-in-Rails-3 pour de nombreuses possibilités.

Ma préférence personnelle est d'utiliser simple_form et de placer l'erreur à côté de l'entrée.

8
Jesse Wolgamott

Voici comment je les affiche pour mon objet de formulaire appelé @location: 

<% if @location.errors.any? %>
<ul>
  <% @location.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
</ul>
<% end %>

Remarque: mettez le code ci-dessus après la ligne <%= form_for @location do |f| %>

28
Danny

Ma façon préférée de le faire et de garder le code simple et sec est la suivante:

Créer un nouvel assistant à l'intérieur de application_helper.rb

# Displays object errors
def form_errors_for(object=nil)
  render('shared/form_errors', object: object) unless object.blank?
end

Créer un nouveau partiel partagé dans 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 %>

Modifiez votre fichier application.html.erb pour inclure les erreurs à l’emplacement souhaité:

<%= yield :form_errors %>

Enfin, placez l’assistant au début de chaque formulaire:

<%= form_for(@model) do |f| %>
  <%= form_errors_for @model %>

  <%# ... form fields ... %>
<% end %>

Cela rend extrêmement simple à gérer et à afficher vos erreurs de formulaire dans de nombreux formulaires.

12
Wes Foster

Je sais que ce n'est pas exactement ce qui a été demandé, mais si vous utilisez la gem simple_form, que je recommande, vous pouvez utiliser f.error_notification, qui prend: message en option.

= f.error_notification message: form_errors_for(your_object)

J'utilise une méthode assez similaire à la réponse de Wes; 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