Вот как я это решил. (Обратите внимание, что в дальнейшем я, очевидно, просто включаю только самые подходящие строки.)
В модели может быть несколько проверок и даже методов, которые потенциально сообщают о множественных ошибках.
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
Кроме того, действие контроллера может устанавливать флеш-сообщения. Наконец, пользователь мог ввести данные в поля ввода, и мы хотим, чтобы они сохранялись и в redirect_to
.
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
В зависимости от настроек может потребоваться или не потребоваться сохранить данные модели, такие как order , в сеанс. Я сделал это с целью передачи данных обратно на исходный контроллер и, таким образом, возможности установить там order снова.
В любом случае, чтобы отобразить фактические сообщения об ошибках и флэш-сообщения, я сделал следующее (в views/shared/_flash_messages.html.erb
, но вы можете сделать это в application.html.erb
или в любом другом месте, которое имеет смысл для вашего приложения). И это благодаря этой строке 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 -->
Для ясности, обычные флэш-сообщения, такие как уведомления, оповещения и т. Д., Будут строками, однако ошибки будут массивами, поскольку вышеупомянутый вызов был errors.to_a