Ruby on rails 设计:重定向到用户最初试图访问的受限页面

Ruby on rails 设计:重定向到用户最初试图访问的受限页面,ruby-on-rails,devise,Ruby On Rails,Devise,我已经看到很多关于将用户重定向到他使用Desive的最后一页的问题。有很好的解释和示例代码 这对我来说很有效,有时我希望这样,但有时,我希望重定向到用户试图访问的受限页面,而不是他以前所在的页面。例如: 用户点击主页上的“创建新帖子按钮” 这将点击posts控制器,这是一个新的操作,受要求用户登录的before_筛选器保护 用户被重定向到登录页面 登录后,用户现在被重定向到主页 但是,在这种情况下,我希望用户被重定向到新操作,并使用他试图访问的新post表单,而不是主页 在使用以下代码段重定向到

我已经看到很多关于将用户重定向到他使用Desive的最后一页的问题。有很好的解释和示例代码

这对我来说很有效,有时我希望这样,但有时,我希望重定向到用户试图访问的受限页面,而不是他以前所在的页面。例如:

  • 用户点击主页上的“创建新帖子按钮”
  • 这将点击posts控制器,这是一个新的操作,受要求用户登录的before_筛选器保护
  • 用户被重定向到登录页面
  • 登录后,用户现在被重定向到主页
  • 但是,在这种情况下,我希望用户被重定向到新操作,并使用他试图访问的新post表单,而不是主页

  • 在使用以下代码段重定向到登录页面之前,请设置当前路径:

    session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
    

    成功登录后检查此会话变量(如果已设置),然后重定向到它。

    因此我意识到,为了重定向到用户登录后试图访问的受保护页面,store_location函数需要是一个before_筛选器,而不是after_筛选器

    before_filter :store_location
    
    def store_location
      # store last url as long as it isn't a /users path
      session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
    end
    
    def after_sign_in_path_for(resource)
      session[:previous_url] || root_path
    end
    

    这是有意义的,因为在这种情况下,会话变量被设置为受保护的页面,因为存储位置函数在我尝试访问
    new\u post\u路径时被正确执行。如果像github代码示例中那样将store_location作为后过滤器,那么上次执行store_location函数的时间是在到达非保护操作时,即我的示例中的主页。

    github上的示例代码与您描述的完全一样!?我已经测试过了。它重定向到用户所在的最后一页,而不是他试图进入的页面。例如,在我的示例中,示例代码会将用户重定向到主页,而不是新的发布页面。因此,您应该仅在用户尝试访问受限页面时设置此会话变量?非常感谢!在使用您引用的建议代码后,我遇到了完全相同的问题。发现将其设置为before_过滤器会导致任何问题的情况吗?现在你已经解释清楚了,为什么在他们给出的例子中没有呢?