Ruby on rails 如何根据远程用户更改Rails路由

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文件,因此

我有一个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路径,可以在
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']
    是罪魁祸首。我看不到其他解决方案。更新了答案,给你一些新的想法。