基于会话参数的Rails路由

时间:2017-05-15 16:58:15

标签: ruby-on-rails session routes

对于特定网址,我们只想重定向某个状态的用户(由session[:state_code]定义)以定向到新网址。

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

3 个答案:

答案 0 :(得分:2)

您可以访问会话引发请求参数-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>')
end

要声明高级约束的其他可能性,请查看Rails官方文档-Advanced Constraints

答案 1 :(得分:0)

我一直在做一些类似的事情。据我所知,你特别想做的事情是不可能的,或者至少是不容易的。问题是routes.rb不知道会话的'hash',所以没有办法查找它。

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

这个博客对我有所帮助,另一种方法是在数据库中保留用户状态。希望这有帮助!

答案 2 :(得分:0)

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

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

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