首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ActionController::Base.relative_url_root的替代品是什么?

ActionController::Base.relative_url_root的替代品是什么?
EN

Stack Overflow用户
提问于 2010-07-06 03:26:53
回答 3查看 17.6K关注 0票数 20

我正在将2.x rails应用程序移植到rails3;我们将其命名为foo-app。Foo-app是一个更大的rails应用程序的一个部分,位于main_rails_app.com/foo-app。之前,我们只是在foo-app生产配置中设置了以下内容,以确保foo-app路由正常工作:

代码语言:javascript
复制
ActionController::Base.relative_url_root = "/foo-app"

然而,使用rails3,我现在得到:

代码语言:javascript
复制
DEPRECATION WARNING: ActionController::Base.relative_url_root is ineffective. Please stop using it.

此后,我已将配置项更改为以下内容:

代码语言:javascript
复制
config.action_controller.relative_url_root = "/foo-app"

这主要是因为所有对外部资源(javascript/css/images)的调用都将使用/foo-app。然而,我的路线没有适当的改变,或者换句话说,foo-app root_path给了我'/‘,而我期望的是'/foo-app’。

两个问题:

  1. ActionController::Base.relative_url_root
  2. if的替代品是什么?它是relative_url_root,那么为什么我的路由不能反映我设置的relative_url_root值?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-21 22:02:29

您应该能够在routes.rb文件中处理所有这些操作。将所有当前路由包装在作用域中;例如。

代码语言:javascript
复制
scope "/context_root" do
   resources :controller
   resources :another_controller
   match 'welcome/', :to => "welcome#index"
   root :to => "welcome#index"
end

然后,您可以通过rake routes验证您的路由,它们应相应地显示您的路由,包括上下文根(Relative_url_root)

票数 19
EN

Stack Overflow用户

发布于 2011-03-28 18:13:21

如果通过Passenger进行部署,请使用RackBaseURI指令:http://www.modrails.com/documentation/Users%20guide%20Apache.html#RackBaseURI

否则,您可以使用以下代码块将run语句包装在config.ru中:

代码语言:javascript
复制
map ActionController::Base.config.relative_url_root || "/" do
  run FooApp::Application
end

然后,您只需将环境变量RAILS_RELATIVE_URL_ROOT设置为"/foo-app“。这甚至适用于在gem或插件中设置的路由。

警告:请勿混用这两种解决方案。

票数 13
EN

Stack Overflow用户

发布于 2014-03-28 05:59:35

我觉得我一定是把这个问题复杂化了,或者错过了什么,但是这个问题已经困扰了我一段时间了,下面是我的笔记。

摘要

对于动态路由和静态路由,有两个不同的问题,每个问题各有两点:

  1. 如何使路由正确匹配入站URL
    • routes
      • static files

  1. 如何通过url帮助程序生成包含relative_root
    • 的url
    • static url

解决这四个问题的一种方法是:

  • 将Nginx配置为剥离relative_root部分
    • 这解决了路由匹配问题;在development

中,只需像development

  • Also静态文件一样在中写入期望URL的路由

  • 设置RAILS_RELATIVE_URL_ROOT环境变量
    • 这解决了生成的静态资产helpers

  • 使用下面的ScriptName中间件(修改它以使用来自环境的值)
    • 这将解决生成的url帮助器,例如users_path

在config.ru中将Rails应用程序包装在Rack::URLMap中(Christoph的回答)

代码语言:javascript
复制
# config.ru
map '/relative_root' do
  run Myapp::Application
end

  • 要求传入的URL包含relative_url_root (可以配置Nginx删除或保留此URL;请参见以下内容)
  • 机架将relative_url_root附加到机架环境SCRIPT_NAME rack/urlmap.rb:62
  • Rails将当前请求的url_for添加到url_for选项Nginx在生成路径时会预置脚本名称Nginx

这样就覆盖了url帮助器生成的url,例如给定的UserControllerusers_path将以相对url根为前缀。

在中间件中设置SCRIPT_NAME

代码语言:javascript
复制
# 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

  • 具有与上述相同的效果,但
  • 要求传入的URL不包含relative_url_root

设置RAILS_RELATIVE_URL_ROOT

configuration.rb:41

  • which的url值保存在app.config.relative_url_root中,进而影响资源路径,就我所见,

  • 不会影响url帮助程序

设置config.action_controller.relative_url_root

  • ??可能会影响资产compilation?
  • Overrides RAILS_RELATIVE_URL_ROOT环境变量?

显式定义/relative_root下的所有路由(rizzah的回答)

代码语言:javascript
复制
# config/routes.rb
Myapp::Application.routes.draw do
  scope '/relative_root' do
    ...
  end
end

Nginx url helper将生成正确的urls

  • Incoming URL必须包含相对url根(对Nginx配置敏感,如下所示),否则请求静态资产的exceptions

  • URLs将为"no
  • “,例如/relative_root/images/logo.png将导致"no route”异常。如果nginx为静态资产提供服务,这可能不是问题。

Nginx配置

给定如下配置:

代码语言:javascript
复制
upstream myapp {
  server localhost:3000;
}

server {
  ...
  location /relative_root {
    proxy_pass http://myapp/;
  }
}

Nginx将去掉/relative_root,Rails应用程序将看不到它。如果您需要Rails应用程序来查看它,一种方法是更改proxy_pass行:

代码语言:javascript
复制
...
    proxy_pass http://myapp/relative_root/;
...
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3181746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档