2013-07-15 5 views
11

Qual è il modo preferito per visualizzare i messaggi di errore di convalida utilizzando form_for in Rails 4?form_for messaggi di errore in Ruby on Rails

<%= form_for @post do |f| %> 
    ... 
<% end %> 
+0

http://stackoverflow.com/questions/3873190/f-error-messages-in-rails-3-0#answer-13246663 –

risposta

26

Questo è quanto ho loro sono la visualizzazione per il mio oggetto form chiamato @location:

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

Nota: mettere il codice di cui sopra dopo la linea <%= form_for @location do |f| %>

10

Il mio modo preferito di fare questo e mantenere il codice semplice e DRY, è il seguente:

Creare un nuovo aiutante all'interno di application_helper.rb

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

creare una nuova condivisa parziale condiviso/_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 %> 

Modificare il file application.html.erb per includere gli errori dove vuoi:

<%= yield :form_errors %> 

Infine, posizionare l'helper all'inizio di ogni modulo:

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

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

Questo lo rende estremamente estremamente semplice da gestire e mostrare gli errori del modulo in molte forme.

+0

La ringrazio molto! In Rails 4.x è molto importante creare una cartella chiamata "shared" in modo che il partial possa essere chiamato correttamente, altrimenti si otterrebbe un errore di ActionView :: MissingTemplate. –

+0

Nell'esempio sopra, <% = yield: form_errors%> sostituisce lo standard <%= yield %> o è in aggiunta a? Cosa aggiunge: form_errors per produrre do contro il rendimento standard? – user2012677

+0

No, non lo sostituisce. La resa standard ha un uso completamente diverso in quanto rende la visualizzazione nel layout. –

0

So che questo non è esattamente quello che è stato chiesto, ma se si utilizza la gemma simple_form, che raccomando, è possibile utilizzare f.error_notification che accetta: messaggio come opzione.

= f.error_notification message: form_errors_for(your_object) 

Io uso un metodo molto simile alla risposta di Wes; form_errors_for all'interno 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 
+1

@kdbanman Immagino che tu sia un po 'distratto? Haha! –