Сообщения проверки после перенаправления - PullRequest
4 голосов
/ 12 мая 2010

У нас есть форма для представления оценок для определенного ресторана в наших представлениях / restaurant / show.html.erb. В случае ошибки проверки мы перенаправляемся обратно в views / restaurant / show.html.erb, но сообщения проверки не отображаются. Мы выяснили, что это происходит, потому что мы теряем сообщения, используя redirect_to (@restaurant) в нашем действии создания RatingController. Но как мы можем вернуться без перенаправления?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 16 марта 2012

Вот как я это решил. (Обратите внимание, что в дальнейшем я, очевидно, просто включаю только самые подходящие строки.)

В модели может быть несколько проверок и даже методов, которые потенциально сообщают о множественных ошибках.

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

2 голосов
/ 19 апреля 2013

Вот как я это сделал, продолжая перенаправление:

Непосредственно перед тем, как вы перенаправите ошибки проверки в вашем хранилище контроллера, чтобы они мигали, как предложено @shingara:

if @restaurant_rating.save
  redirect_to @restaurant, :notice => "Successfully added rating to restaurant."
else
  flash[:error] = @restaurant_rating.errors
  redirect_to @restaurant, :alert => "There were errors to add rating to restaurant. " 
end

Затем в форме для оценки вы присваиваете ошибки обратно для объекта рейтинга непосредственно перед отображением формы:

- flash[:error].messages.each {|error| @restaurant_rating.errors.add(error[0], error[1][0]) } if flash[:error]
= simple_form_for @restaurant_rating do |f|
  ....
2 голосов
/ 12 мая 2010

Вы можете передать свою ошибку на флэш-сообщении

flash[:error] = @restaurant.errors

После того, как вам нужно будет отобразить ее в вашем перенаправлении

1 голос
/ 12 мая 2010

Вы можете использовать render вместо redirect_to

render :action => "show"

или установите flash[:error], flash[:notice] снова, потому что они автоматически сбрасываются

0 голосов
/ 12 мая 2010

После уточнения в комментарии необходимо настроить

/ приложение / просмотров / макеты / application.html.erb

с этой строкой

<%- flash.each do |name, msg| -%><%= content_tag :div, msg, :id => "flash_#{name}" %><%- end -%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...