【问题标题】:Rails Routing Based on Session Parameter基于会话参数的 Rails 路由
【发布时间】:2019-12-10 18:08:48
【问题描述】:

对于特定的 URL,我们只想重定向处于特定状态的用户(由 session[:state_code] 定义以被定向到新的 URL。

所有其他用户都应该看到并重定向到旧 URL。我们如何在 Rails 中有效地做到这一点?我们无法从路由约束访问会话。对于我不会涉及的复杂问题,我们需要在 routes.rb 中执行此重定向,而不是在控制器中执行此操作。

【问题讨论】:

    标签: ruby-on-rails session routes


    【解决方案1】:

    您可以访问会话抛出请求参数 - request.session

    示例:

    Rails.application.routes.draw do
      root to: redirect('<specific URL>'), constraints: lambda { |request|
        request.session[:state_code] == <specific value>
      }
      root to: redirect('<old URL>'), as: 'root_old'
    end
    

    有关声明高级约束的不同可能性,请查看 Rails 官方文档 - Advanced Constraints

    同样可以通过向redirect 提供一个块来实现(有关更多详细信息,请参阅Redirection):

    示例:

    Rails.application.routes.draw do
      root to: redirect{ |path_params, request|
        request.session[:state_code] == <specific value> ? '<specific URL>' : '<old URL>'
      }
    end
    

    【讨论】:

    • 在 Rails 6 上获取 ArgumentError: Invalid route name, already in use: 'root'
    • @thisismydesign 感谢您的评论。问题github.com/rails/rails/pull/34494 引入了中断修改。因此,要修复它,您只需为某些路线分配手动as: 参数。用这样的修改修复我的帖子。
    • 谢谢!我将get '/', to: '...', constraints: ... 用于其中一条路线。对于这两种方法,我能想到的唯一限制是,不确定我是否可以始终调用 root_path 或者仅通过 root 定义它。
    【解决方案2】:

    我一直在做一些类似的事情。据我了解,您具体想做的事情是不可能的,或者至少是不可能的。问题是 routes.rb 不知道会话“哈希”,因此无法查找。

    http://bjedrocha.com/rails/2015/03/18/role-based-routing-in-rails/

    这个博客帮助了我,另一种方法是将用户状态持久化在数据库中。希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      按照@ych 的建议使用 request.session[:state_code]

      get('/your_route', constraints: AuthenticatedConstraint.new, to: redirect do |_p, req| req.flash[:error] = 'not_authorized '/' end)

      并在app/constraints 中定义AuthenticatedConstraint 与返回def matches?(request)true/false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 2023-03-23
        相关资源
        最近更新 更多