我正在将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’。
两个问题:
发布于 2010-07-21 22:02:29
您应该能够在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)
发布于 2011-03-28 18:13:21
如果通过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“。这甚至适用于在gem或插件中设置的路由。
警告:请勿混用这两种解决方案。
发布于 2014-03-28 05:59:35
我觉得我一定是把这个问题复杂化了,或者错过了什么,但是这个问题已经困扰了我一段时间了,下面是我的笔记。
摘要
对于动态路由和静态路由,有两个不同的问题,每个问题各有两点:
解决这四个问题的一种方法是:
relative_root
部分中,只需像development
RAILS_RELATIVE_URL_ROOT
环境变量
ScriptName
中间件(修改它以使用来自环境的值)users_path
在config.ru中将Rails应用程序包装在Rack::URLMap中(Christoph的回答)
# config.ru
map '/relative_root' do
run Myapp::Application
end
SCRIPT_NAME
rack/urlmap.rb:62这样就覆盖了url帮助器生成的url,例如给定的UserController
,users_path
将以相对url根为前缀。
在中间件中设置SCRIPT_NAME
# 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
设置RAILS_RELATIVE_URL_ROOT
app.config.relative_url_root
中,进而影响资源路径,就我所见,
设置config.action_controller.relative_url_root
显式定义/relative_root
下的所有路由(rizzah的回答)
# config/routes.rb
Myapp::Application.routes.draw do
scope '/relative_root' do
...
end
end
Nginx url helper将生成正确的urls
/relative_root/images/logo.png
将导致"no route”异常。如果nginx为静态资产提供服务,这可能不是问题。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/;
...
https://stackoverflow.com/questions/3181746
复制相似问题