基于会话参数的 Rails 路由

wis*_*lin 1 session routes ruby-on-rails

对于特定 URL,我们希望仅重定向处于特定状态的用户(定义为session[:state_code]定向到新 URL。

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

ych*_*ych 6

您可以访问会话抛出请求参数 - 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
Run Code Online (Sandbox Code Playgroud)

对于声明高级约束的不同可能性,请参阅 Rails 官方文档 -高级约束

可以通过提供一个块来实现相同的目的redirect(更多详细信息请参阅重定向):

例子:

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