Подтвердить что ты не робот

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 - это еще один контроллер и действие.

4b9b3361

Ответ 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 для другого ресурса