Rails, потеряв flash после redirect_to
Я не могу понять, почему мои flash-сообщения исчезают после redirect_to. Начал отладчик в моем представлении, и переменная вспышки полностью пуста.
flash
=> {}
Результат тот же самый с flash.now... Он отлично работает, если я что-то редактирую и вызываю render.
Контроллер:
def create
@user_session = UserSession.new(params[:user_session])
if @user_session.save
flash[:notice] = "Logged in"
redirect_to root_url
else
render :action => 'new'
end
end
Макет приложения:
- flash.each do |name, msg|
=content_tag :div, msg, :class => "flash_#{name}"
root_url - это еще один контроллер и действие.
Ответы
Ответ 1
Когда вы используете функцию флэш-сообщений, есть два способа отображения сообщений:
Мгновенно на одной и той же загрузке страницы и доступной в представлении от flash['foo']
:
flash.now['foo'] = "Hello world"
Или при перенаправлении на другую страницу и доступной из flash['notice']
:
redirect_to root_url, notice: "Hello world"
Веб-сайт рубинов на рельсах является действительно хорошей ссылкой:
http://guides.rubyonrails.org/action_controller_overview.html#the-flash
Ответ 2
Если вы используете двойной переадресацию (например, перенаправление на root, которое затем перенаправляется на пользователя), вам необходимо передать flash.
def first_action
flash[:notice] = "Logged in"
redirect_to root_url
end
def second_redirect_action
redirect_to current_user, flash: flash
end
Ответ 3
Это был плагин render_component
. Ломает рельсы 2.3.2.
Ответ 4
Я тоже столкнулся с этой проблемой, в Rails 4, и некоторое время, немного ударив головой о мой компьютер, я заметил это в журналах Rails: Can't verify CSRF token authenticity
.
Оказалось, я отправлял через форму, в которой не было токена CSRF. Удивительно, но он все еще вызывал мой метод контроллера и все еще выполнял перенаправление, но это было то, что отбрасывало все.
Добавление маркера CSRF в мою форму исправил его.
Ответ 5
Если вы перенаправляетесь на другое действие, используйте flash
и если вы выполняете одно и то же действие, используйте flash.now
Ответ 6
Мой flash-рендеринг не работал для root_url из-за моей маршрутизации. У меня был root_url, перенаправленный на одну другую страницу, например root: to = > redirect ('[SOME_OTHER_PAGE]'). Вместо этого я просто использую redirect_to для другого ресурса