Voici comment je résolu ce problème. (Notez que dans ce qui suit, je ne vais évidemment inclure que les lignes les plus pertinentes.)
Dans le modèle, il peut y avoir plusieurs validations et même des méthodes pouvant potentiellement générer des rapports sur plusieurs erreurs. En plus
class Order < ActiveRecord::Base
validates :name, :phone, :email, :presence => true
def some_method(arg)
errors.add(:base, "An error message.")
errors.add(:base, "Another error message.")
end
end
, l'action du contrôleur peut définir des messages flash. Enfin, l'utilisateur peut avoir entré des données dans les champs de saisie, et nous voulons qu'il persiste à travers le redirect_to
aussi.
class OrdersController < ApplicationController
def create
@order = Order.new(params[:order])
respond_to do |format|
if @order.save
session.delete(:order) # Since it has just been saved.
else
session[:order] = params[:order] # Persisting the order data.
flash[:notice] = "Woohoo notice!" # You may have a few flash messages
flash[:alert] = "Woohoo alert!" # as long as they are unique,
flash[:foobar] = "Woohoo foobar!" # since flash works like a hash.
flash[:error] = @order.errors.to_a # <-- note this line
format.html { redirect_to some_path }
end
end
end
end
En fonction de votre configuration, vous pouvez ou ne pas avoir besoin d'enregistrer les données de modèle, tels que ordre, à la session. Je l'ai fait dans le but de transmettre les données au contrôleur d'origine, et ainsi être en mesure d'installer le ordre là encore. En tout cas, pour afficher l'erreur réelle et les messages flash, j'ai fait ce qui suit (en views/shared/_flash_messages.html.erb
, mais vous pouvez le faire en application.html.erb
ou partout ailleurs est logique pour votre application). Et cela grâce à cette ligne flash[:error] = @order.errors.to_a
<div id="flash_messages">
<% flash.each do |key, value|
# examples of value:
# Woohoo notice!
# ["The server is on fire."]
# ["An error message.", "Another error message."]
# ["Name can't be blank", "Phone can't be blank", "Email can't be blank"]
if value.class == String # regular flash notices, alerts, etc. will be strings
value = [value]
end
value.each do |value| %>
<%= content_tag(:p, value, :class => "flash #{key}") unless value.empty? %>
<% end %>
<% end %>
</div><!-- flash_messages -->
Pour être clair, les messages flash réguliers tels que les avis, les alertes, etc.seront des chaînes, des erreurs seront cependant des tableaux depuis l'appel ci-dessus était errors.to_a
Si ma réponse ne va pas au point s'il vous plaît poster un peu plus de détails – tommasop
@ réponse fl00r est ce que vous cherchez! – klew