我正在将2.x rails应用移植到rails3;我们称之为foo-app。 Foo-app是更大的rails应用程序的一部分,位于main_rails_app.com/foo-app。以前我们只是在foo-app生产配置中设置以下内容,以确保我们的foo-app路由正常工作:
ActionController::Base.relative_url_root = "/foo-app"
然而,使用rails3,我现在得到:
DEPRECATION WARNING: ActionController::Base.relative_url_root is ineffective. Please stop using it.
我已将配置条目更改为以下内容:
config.action_controller.relative_url_root = "/foo-app"
这主要是因为对外部资源(javascript / css / images)的所有调用都将使用/ foo-app。但是,我的路线没有任何改变,换句话说,foo-app root_path给我'/'当我期待'/ foo-app'时。
两个问题:
答案 0 :(得分:19)
您应该能够处理routes.rb文件中的所有内容。将所有当前路线包裹在范围内;例如。
scope "/context_root" do
resources :controller
resources :another_controller
match 'welcome/', :to => "welcome#index"
root :to => "welcome#index"
end
然后,您可以通过rake routes
验证您的路由,他们应该相应地显示您的路由,包括您的上下文根(relative_url_root)
答案 1 :(得分:13)
如果您通过Passenger进行部署,请使用RackBaseURI
指令:http://www.modrails.com/documentation/Users%20guide%20Apache.html#RackBaseURI
否则,您可以使用以下块将run
语句包装在config.ru
中:
map ActionController::Base.config.relative_url_root || "/" do
run FooApp::Application
end
然后,您只需将环境变量RAILS_RELATIVE_URL_ROOT
设置为“/ foo-app”。这甚至适用于在宝石或插件中设置的路线。
警告:不要混用这两种解决方案。
答案 2 :(得分:5)
我觉得我必须过度复杂化和/或遗漏某些东西,但这个问题让我感到沮丧一段时间了,这是我的笔记。
有两个单独的问题,每个问题有两个点用于动态和静态路由:
解决所有四点的一种方法:
relative_root
部分
/
开发RAILS_RELATIVE_URL_ROOT
环境变量
ScriptName
中间件(修改它以使用环境中的值)
users_path
# config.ru
map '/relative_root' do
run Myapp::Application
end
SCRIPT_NAME
rack/urlmap.rb:62 SCRIPT_NAME
添加到url_for选项metal/url_for.rb:41 因此,它涵盖了网址助手生成的网址,例如给定UserController
,users_path
将以相对网址为前缀。
# config.ru
class ScriptName
def initialize(app, name)
@app = app
@name = name
end
def call(env)
env['SCRIPT_NAME'] += @name
@app.call(env)
end
end
use ScriptName, '/relative_root'
run Rails.application
app.config.relative_url_root
configuration.rb:41 config.action_controller.relative_url_root
/relative_root
下的所有路线(rizzah的回答)# config/routes.rb
Myapp::Application.routes.draw do
scope '/relative_root' do
...
end
end
/relative_root/images/logo.png
将导致“无路由匹配”异常。如果nginx无论如何都在提供静态资产,这可能不是问题。给出这样的配置:
upstream myapp {
server localhost:3000;
}
server {
...
location /relative_root {
proxy_pass http://myapp/;
}
}
Nginx将删除/relative_root
,而Rails应用程序将无法看到它。如果您需要Rails应用程序,请查看它,一种方法是更改proxy_pass
行:
...
proxy_pass http://myapp/relative_root/;
...