Ruby on rails 如何根据远程用户更改Rails路由
我有一个Rails 4.1应用程序。我想更改Ruby on rails 如何根据远程用户更改Rails路由,ruby-on-rails,Ruby On Rails,我有一个Rails 4.1应用程序。我想更改/home的工作方式,具体取决于环境变量REMOTE\u USER 我的routes.rb文件中有这个: get "home" => Utility.home_page(ENV['REMOTE_USER']) 函数实用程序.home_page根据参数值返回app1#home、app2#home或帮助#索引中的一个 但是,似乎routes.rb只加载一次,因此所有用户最终都会被定向到同一个应用程序。routes.rb实际上是一个ruby文件,因此
/home
的工作方式,具体取决于环境变量REMOTE\u USER
我的routes.rb文件中有这个:
get "home" => Utility.home_page(ENV['REMOTE_USER'])
函数实用程序.home_page
根据参数值返回app1#home
、app2#home
或帮助#索引
中的一个
但是,似乎routes.rb
只加载一次,因此所有用户最终都会被定向到同一个应用程序。routes.rb
实际上是一个ruby
文件,因此您可以在那里执行所有需要的验证
如果需要根据环境变量的值更改home路径,可以在routes.rb中执行类似操作:
if ENV['REMOTE_USER'] == 'foo'
get "home" => 'app1#home'
elsif ENV['REMOTE_USER'] == 'bar'
get "home" => 'app2#home'
end
可能存在两个问题:
您正在尝试从为服务器应用程序而不是每个请求设置的ENV变量中获取REMOTE\u USER
值。一旦服务器启动,ENV['REMOTE_USER']就不会更改,并且对所有请求和用户都是相同的
看起来您需要的是从请求环境中获取值:request.env[“REMOTE\u USER”]
当应用程序启动时,实用程序主页(ENV['REMOTE\u USER'])
将只计算一次。您需要根据请求对lambda表达式使用约束
解决方案可能是这样的:
get "home", to: "app1#home", constraints: lambda { |request| Utility.home_page(request.env['REMOTE_USER']) == "app1#home" }
get "home", to: "app2#home", constraints: lambda { |request| Utility.home_page(request.env['REMOTE_USER']) == "app2#home" }
get "home", to: "helps#index", constraints: lambda { |request| Utility.home_page(request.env['REMOTE_USER']) == "helps#index" }
get "home", to: "app1#home", constraints: lambda { |request| Utility.home_page?(:app1, request.env['REMOTE_USER']) }
get "home", to: "app2#home", constraints: lambda { |request| Utility.home_page?(:app2, request.env['REMOTE_USER']) }
get "home", to: "helps#index", constraints: lambda { |request| Utility.home_page?(:helps, request.env['REMOTE_USER']) }
在这种情况下,我将更改实用程序
api以如下方式工作:
get "home", to: "app1#home", constraints: lambda { |request| Utility.home_page(request.env['REMOTE_USER']) == "app1#home" }
get "home", to: "app2#home", constraints: lambda { |request| Utility.home_page(request.env['REMOTE_USER']) == "app2#home" }
get "home", to: "helps#index", constraints: lambda { |request| Utility.home_page(request.env['REMOTE_USER']) == "helps#index" }
get "home", to: "app1#home", constraints: lambda { |request| Utility.home_page?(:app1, request.env['REMOTE_USER']) }
get "home", to: "app2#home", constraints: lambda { |request| Utility.home_page?(:app2, request.env['REMOTE_USER']) }
get "home", to: "helps#index", constraints: lambda { |request| Utility.home_page?(:helps, request.env['REMOTE_USER']) }
ENV变量是为服务器应用程序设置的,而不是为每个请求设置的。服务器启动后,ENV['REMOTE_USER']
不会更改,并且对所有请求和用户都是相同的。如果有多个应用程序,则每个应用程序都有自己的ENV变量和routes.rb
文件。如果用户使用相同的ENV变量和routes.rb
文件请求相同的应用程序,您如何期望用户得到不同的响应?@chumakoff根据每个服务器的配置,该项目可能有复杂的用例。无论哪种情况,OP所要求的都可以很容易地实现。ENV['REMOTE_USER']对于所有请求和用户都是相同的。它不是按请求设置的。无论如何,当应用程序启动时,if-else
只运行一次。@chumakoff没错ENV['REMOTE_USER']
是一个环境变量,routes.rb
只加载一次。如果OP希望根据运行其应用程序的服务器更改路由的操作,它将起作用。否则,您的答案就是正确的方法。是否可以将三个get“home”…
子句替换为一个使用实用程序输出的子句。主页(…)
用于to:
参数?使用ENV['REMOTE\u USER']
是罪魁祸首。我看不到其他解决方案。更新了答案,给你一些新的想法。