在重定向

时间:2016-02-04 16:20:37

标签: ruby-on-rails ruby ruby-on-rails-4

我在ApplicationController方法中有重定向,并想通过以下方式发送通知:

class ApplicationController < ActionController::Base

  def redirect_if_no_user
    if current_user.nil?
      redirect_to root_path, notice: t('errors.session_expired')
    end
  end

end

我在其他一些控制器操作中调用redirect_if_no_user

不幸的是,在我手动重新加载主页之前,我看不到通知(在我通过该方法重定向到它之后)。 这种行为是有意的吗?有人有想法吗?

4 个答案:

答案 0 :(得分:2)

来自rails文档,(http://guides.rubyonrails.org/action_controller_overview.html#the-flash

默认情况下,向Flash添加值将使它们可用于下一个请求,但有时您可能希望在同一请求中访问这些值。例如,如果创建操作无法保存资源并且您直接呈现新模板,则不会产生新请求,但您可能仍希望使用闪存显示消息。为此,您可以像使用普通闪存一样使用flash.now:

flash.now[:notice] = t('errors.session_expired')
redirect_to root_path

答案 1 :(得分:1)

看起来可能受益于flash.now

我遇到了你提到过的问题(重定向没有闪现),我还没有完全解决它。我找到的一件事是使用flash.now帮助其他人解决问题:

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  def redirect_if_no_user
    if !user_signed_in? #-> assuming you're using devise
      flash.now[:notice] = t('errors.session_expired')
      redirect_to root_path
    end
  end

end

这可能不起作用。如果没有,我会删除。

答案 2 :(得分:1)

我之前遇到过这个问题......

您(最终)看到的闪光通知可能不是您认为的闪光通知。

redirect_to root_path

但我敢打赌你的root_path有它自己的重定向,而重定向意味着你已经丢失了闪存通知。当您在root_path上提交时,您正在redirect_if_no_user上进行另一次调用,这次您会看到flash消息。

您通常可以解决此问题(重定向丢失Flash消息后的重定向)

使用flash.keep方法。

def my_root_path_action
  flash.keep
  ...
end

...如果他们在您的操作被调用之前重定向,则可能需要使用before_actionbefore_filter方法之一。

答案 3 :(得分:0)

    flash[:notice] = t('errors.session_expired')
    redirect_to root_path

试试。