【问题标题】:How to set up route variable based on rails 3.1 environment?如何基于 rails 3.1 环境设置路由变量?
【发布时间】:2012-05-07 16:13:40
【问题描述】:

在生产中,我们的 rails 3.1.4 应用程序部署到 suburi server_ip/by。部署到 suburi /by 需要在调用 link_to 时将 /by 附加到自定义方法“view_handler”(用于记录观看历史)前面。以下是 Rails 生产的示​​例:

<%= link_to 'Projects', "/by/view_handler?index=1&url=#{projects_path}" %>

然而,在开发或测试环境中,'/by' 不是必需的(会导致错误),并且 link_to 看起来像:

<%= link_to 'Projects', "/view_handler?index=1&url=#{projects_path}" %>

在 routes.rb 中,我们有:

  match '/view_handler', :to => 'application#view_handler'

有没有办法只在 rails 环境或 routes.rb 中设置,而不更改 rails 代码本身以进行 suburi 部署?或者我们如何才能在 Rails 生产中只为 link_to 附加 suburi?

【问题讨论】:

    标签: ruby-on-rails deployment ruby-on-rails-3.1


    【解决方案1】:

    试试:

      scope(Rails.env=='production' ? '/by' : '') do
        resources :foos
        ....
      end
    

    【讨论】:

    • 将 routes.rb 中的所有内容都放入作用域?范围有什么作用?谢谢。
    • 它接受路径(默认)、控制器、模块的选项。假设您要定义一个可选的语言环境(例如 site.com/en/resources/5)。你会怎么做?您会为每个资源添加前缀吗?使用范围,您可以这样做:scope '(:locale)' do ... end.
    • 范围不适用于根“/”。没有匹配。我们的系统已设置为在乘客 (nginx) 中进行 suburi 部署,并且范围可能与此冲突。无论如何,谢谢。
    • 你是什么意思它对根'/'不起作用?你能说得更具体点吗?
    • 当然,如果你把所有东西都放在你的范围内,你就没有它。如果您希望您的用户在到达/ 路径时被重定向到/by 路径,那么只需添加以下行:match '' =&gt; redirect('/by') if Rails.env=='production' OUTSIDE your scope。
    【解决方案2】:

    我不确定我是否理解正确,但我可以想到两件事来尝试:

    1) 在 routes.rb 中将您的生产路线放在您的开发路线之前。 Rails 会先尝试匹配它,如果你在 dev/test 中它会失败,然后尝试匹配 dev/test 路由并成功。如果您在生产中,它当然会匹配第一条路线。

    2) 将两条路线包装在条件语句中,使用Rails.env.production? 根据环境确定要绘制的路线,例如

    if Rails.env.production?
      match #production route
    else
      match #dev/test route
    

    【讨论】:

    • 您的意思是在生产中匹配以下内容:如果 Rails.env.production?匹配 '/by/view_handler', :to => 'application#view_handler' 否则匹配 '/view_handler', :to => 'application#view_handler' 结束
    • 是的,如果我理解您正在尝试正确处理这些路线。
    • 修改后返回的url为server_ip/view_handler?index=1&url=/by/manufacturers,无效。它与更改之前返回的内容相同。还是谢谢。
    • jdoe 的解决方案有效吗?我认为我们的两个答案都会产生相同的结果(尽管我认为@jdoe 更合适);知道我是否错了对我来说很有教育意义。
    • jdoe 还没有。 “/”存在 routingError。没有匹配。可能需要定义一个全局常量作为通过 url 传递 var 的前缀,这会在此处产生问题。 jdoe 的解决方案可能在控制器级别上很好。但是,由于与 suburi 部署的乘客设置冲突,很难使其适用于整个应用程序。
    【解决方案3】:

    这是我们决定用于解决路由中断问题的方法。在初始值设定项中,my_constant.rb 是通过以下方式创建的:

    if Rails.env.production?
      SUBURI = "/by"
    else
      SUBURI = ''
    end
    

    在每个 /view_handler 之前,添加 SUBURI。例如,

    <%= link_to 'Projects', "/view_handler?index=1&url=#{projects_path}" %>
    

    变成:

    <%= link_to 'Projects', SUBURI + "/view_handler?index=1&url=#{projects_path}" %>
    

    应该将 SUBURI 添加到每个传递变量的 url。该解决方案到目前为止有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-20
      • 2011-06-25
      • 2018-01-04
      • 2013-08-30
      • 1970-01-01
      • 2019-07-02
      • 2014-09-29
      相关资源
      最近更新 更多