对于特定网址,我们只想重定向某个状态的用户(由session[:state_code]
定义)以定向到新网址。
所有其他用户都应该看到并重定向到旧网址。我们怎样才能在Rails中有效地做到这一点?我们无法从路由约束中访问会话。对于我不会进入的复杂问题,我们需要在routes.rb中进行此重定向,而不是在控制器中执行此操作。
答案 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