2012-05-07 46 views
0

在生产中,我们的rails 3.1.4 app部署到suburi server_ip/by。在调用link_to时,部署到suburi/by需要在自定义方法“view_handler”前面添加/ by(用于记录观看历史记录)。这里是在轨道的生产例子:如何设置基于rails 3.1环境的路由变量?

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

在开发或测试环境,但是,“/由”不是需要(将导致错误)和的link_to看起来像:

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

在routes.rb中,我们有:

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

有没有办法在轨环境或routes.rb中,而不是改变Rails代码本身suburi安装部署?或者,我们如何才能在rails生产中仅为link_to添加suburi?非常感谢

回答

1

我不知道我理解正确,但我能想到的两件事情尝试:

1)把你的生产路线在routes.rb中的发展路线的前方。 Rails会首先尝试匹配它,如果你在开发/测试中,它将失败,然后尝试匹配开发/测试路线并取得成功。如果你在生产,它当然会匹配第一条路线。 2)在条件语句中包装两条路线,使用Rails.env.production?来基于环境确定要绘制哪条路线,例如,使用Rails.env.production?

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

您的意思是在生产匹配以下内容:如果Rails.env.production?匹配'/ by/view_handler',:to =>'application#view_handler'else else'/ view_handler',:to =>'application#view_handler'end – user938363

+0

是的,如果我理解你正在试图对这些路线做什么。 –

+0

更改后,返回的URL是http:// server_ip/view_handler?index = 1&url =/by/manufacturer,并且不起作用。它与更改之前返回的内容相同。不管怎么说,还是要谢谢你。 – user938363

3

尝试:

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

将所有内容放入routes.rb中?范围是做什么的?谢谢。 – user938363

+0

它接受路径(默认),控制器,模块的选项。说,你即将定义一个可选的语言环境(如site.com/'en'/resources/5)。你会如何做到这一点?你会以每个资源为前缀吗?使用scope可以这样做:'scope'(:locale)'do ... end'。 – jdoe

+0

范围对root“/”不起作用。没有匹配。我们的系统已经设置为乘客(nginx)中的suburi部署,范围可能与此有冲突。不管怎么说,还是要谢谢你。 – user938363

0

下面是我们决定用破碎的路线问题。在初始化,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应该被添加到每一个该变量传递网址。该解决方案迄今为止工作。