ynk*_*nkr 20 ruby-on-rails ruby-on-rails-3
我正在将一个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"
Run Code Online (Sandbox Code Playgroud)
但是,使用rails3,我现在得到:
DEPRECATION WARNING: ActionController::Base.relative_url_root is ineffective. Please stop using it.
Run Code Online (Sandbox Code Playgroud)
我已经将配置条目更改为以下内容:
config.action_controller.relative_url_root = "/foo-app"
Run Code Online (Sandbox Code Playgroud)
这主要是因为对外部资源(javascript/css/images)的所有调用都将使用/ foo-app.但是,我的路线没有任何改变,换句话说,foo-app root_path给我'/'当我期待'/ foo-app'.
两个问题:
小智 19
您应该能够处理routes.rb文件中的所有内容.将所有当前路线包裹在范围内; 例如.
scope "/context_root" do
resources :controller
resources :another_controller
match 'welcome/', :to => "welcome#index"
root :to => "welcome#index"
end
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过相应的方式验证您的路由rake routes,包括您的上下文根(relative_url_root)
Chr*_*nig 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
Run Code Online (Sandbox Code Playgroud)
然后你只需要将环境变量设置RAILS_RELATIVE_URL_ROOT为"/ foo-app".这甚至适用于在宝石或插件中设置的路线.
警告:不要混用这两种解决方案.
我觉得我必须使这个问题变得过于复杂和/或缺少某些东西,但是这个问题已经让我感到沮丧了一段时间,以下是我的笔记。
对于动态和静态路由,存在两个单独的问题,分别有两点:
解决所有四点的一种方法:
relative_root部分
/类似的开发中写出期望URL的路由RAILS_RELATIVE_URL_ROOT环境变量
ScriptName下面的中间件(对其进行修改以使用环境中的值)
users_path# config.ru
map '/relative_root' do
run Myapp::Application
end
Run Code Online (Sandbox Code Playgroud)
SCRIPT_NAME 架/urlmap.rb:62SCRIPT_NAME到url_for选项metal / url_for.rb:41这样就涵盖了由url helper生成的URL(例如,给定的UserController)users_path将以相对URL根作为前缀。
# 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
/relative_root/images/logo.png将导致“没有路由匹配”异常。如果nginx仍在提供静态资产,这可能不是问题。给定这样的配置:
upstream myapp {
server localhost:3000;
}
server {
...
location /relative_root {
proxy_pass http://myapp/;
}
}
Run Code Online (Sandbox Code Playgroud)
Nginx将删除/relative_root,而Rails应用程序将看不到它。如果您需要Rails应用程序以便看到它,一种方法是更改proxy_pass行:
...
proxy_pass http://myapp/relative_root/;
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16772 次 |
| 最近记录: |