2010-07-05 11 views
18

Estoy portando una aplicación de rieles 2.x a rails3; lo llamaremos foo-app. Foo-app es una sección de una aplicación de rieles más grande y vive en main_rails_app.com/foo-app. Anteriormente acabamos de configurar los siguientes en nuestra producción de configuración foo-aplicación para asegurarse de que nuestras rutas foo-app funcionaba correctamente:¿Cuál es el reemplazo de ActionController :: Base.relative_url_root?

ActionController::Base.relative_url_root = "/foo-app" 

Sin embargo, con rails3, ahora obtener:

DEPRECATION WARNING: ActionController::Base.relative_url_root is ineffective. Please stop using it. 

tengo cambiado desde la entrada de configuración a lo siguiente:

config.action_controller.relative_url_root = "/foo-app" 

Esto funciona principalmente en que todas las llamadas a los recursos externos (javascript/css/images) utilizará/foo-aplicación. Sin embargo, ninguna de mis rutas cambia apropiadamente, o dicho de otra manera, foo-app root_path me da '/' cuando esperaría '/ foo-app'.

dos preguntas:

  1. ¿Cuál es el reemplazo para ActionController :: Base.relative_url_root
  2. si es config.action_controller.relative_url_root, entonces ¿por qué son mis rutas no refleja el valor relative_url_root puse?
+2

¿Se config.action_controller.relative_url_root siguen trabajando para que en los últimos 3 carriles versión final? Parece roto para mí. – raidfive

+0

Te falta "hacer" ámbito "/ raíz_contexto" do ... final – Dejan

Respuesta

18

Debería poder manejar todo eso dentro del archivo routes.rb. Envuelva todas sus rutas actuales en el alcance; por ejemplo.

scope "/context_root" do 
    resources :controller 
    resources :another_controller 
    match 'welcome/', :to => "welcome#index" 
    root :to => "welcome#index" 
end 

A continuación, puede verificar su enrutamiento a través de la rake routes deben mostrar sus rutas en consecuencia, incluyendo su raíz de contexto (relative_url_root)

+0

Hola Dax, gracias por la respuesta. Encontré esta misma solución un par de días antes de que la publicara el 7-21, pero tener su publicación confirma que hice/encontré la solución correcta. Gracias. – ynkr

+1

Esto es útil, pero ¿cómo se aplica de manera diferente para su entorno de desarrollo frente a su entorno de producción? Mi entorno de desarrollo no necesita estar detrás de un proxy inverso como el entorno de producción. – tobinjim

+14

@tobinjim Descubrí que necesitaba establecer la variable de entorno 'RAILS_RELATIVE_URL_ROOT' además de envolver mis rutas en un ámbito.Luego utilicé 'scope ENV ['RAILS_RELATIVE_URL_ROOT'] || '/' do' para que localhost: 3000 todavía funcione en desarrollo sin la raíz/context_root. – aNoble

12

Si despliega a través de pasajeros, utilizar el RackBaseURI Directiva: http://www.modrails.com/documentation/Users%20guide%20Apache.html#RackBaseURI

De lo contrario, puede ajustar la declaración run en su config.ru con el siguiente bloque:

map ActionController::Base.config.relative_url_root || "/" do 
    run FooApp::Application 
end 

Luego solo tiene que establecer la variable de entorno RAILS_RELATIVE_URL_ROOT en "/ foo-app". Esto incluso se aplicará a las rutas establecidas en gemas o complementos.

Advertencia: no mezcle estas dos soluciones.

4

Siento que debo estar complicando demasiado esto y/o faltando algo, pero este problema me ha estado frustrando por un tiempo, y aquí están mis notas.

Resumen

Hay dos cuestiones separadas con dos puntos cada uno para las rutas dinámicas y estáticas:

  1. Como llegar enrutamiento para que coincida correctamente una dirección URL entrante
    • para las rutas
    • de archivos estáticos
  2. cómo generar URL que incluir la relative_root
    • a través de ayudantes url
    • para los activos estáticos

Una manera de resolver los cuatro puntos:

  • Configurar Nginx para despojar a la parte relative_root
    • Esto resuelve la coincidencia de ruta; acaba de escribir rutas esperando URL en / como el desarrollo
    • también archivos estáticos se sirvieron en el desarrollo
  • Establecer RAILS_RELATIVE_URL_ROOT ambiente variables ayudantes activos estáticos
    • Esto resuelve genera
  • Use la ScriptName middleware a continuación (modificarlo para utilizar el valor del ambiente)
    • Esto resuelve los ayudantes de URL generados, p. users_path

Envolver la aplicación Rails en rack :: URLMap en config.ru (respuesta de Christoph)

# config.ru 
map '/relative_root' do 
    run Myapp::Application 
end 
  • requiere dirección URL entrante contiene la relative_url_root (Nginx se puede configurar para eliminar o retener esto; ver más abajo)
  • Rack anexa la raíz_url_relacionada al Rack env SCRIPT_NAMErack/urlmap.rb:62
  • rieles suma de SCRIPT_NAME la solicitud actual a url_for opciones metal/url_for.rb:41 url_for
  • Rails antepone el nombre del script al generar caminos routing/url_for.rb:133

Así que cubre URL generadas por los ayudantes URL, por ejemplo dado UserController, users_path se usará como prefijo de la raíz URL relativa.

Conjunto SCRIPT_NAME en middleware

# 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 
  • tiene el mismo efecto que el anterior, pero
  • Requiere que la URL entrante no contiene la relative_url_root

Configuración RAILS_RELATIVE_URL_ROOT

Configuración config.action_controller.relative_url_root

  • ?? Puede afectar la compilación de activos?
  • Anula RAILS_RELATIVE_URL_ROOT env var?

la definición explícita de todas las rutas bajo /relative_root (respuesta de rizzah)

# config/routes.rb 
Myapp::Application.routes.draw do 
    scope '/relative_root' do 
    ... 
    end 
end 
  • ayudantes URL generar URL correctas
  • URL entrante debe contener la raíz de URL relativa (sensible a la configuración de Nginx, véase más adelante), sino "no hay coincidencias de ruta" excepciones
  • URLs que solicitan activos estáticos, por ejemplo /relative_root/images/logo.png dará como resultado las excepciones "sin coincidencias de ruta". Esto puede no ser un problema si nginx está sirviendo activos estáticos de todos modos.

Nginx config

Dada una configuración como esta:

upstream myapp { 
    server localhost:3000; 
} 

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

Nginx se tira de la /relative_root, y la aplicación Rails no lo verá. Si necesita la aplicación rieles para ver que, de una manera es cambiar la línea proxy_pass:

... 
    proxy_pass http://myapp/relative_root/; 
... 
+1

Para evitar que stripping'/relative_root' por Nginx, también puede usar 'proxy_pass http:// myapp; '(falta de barra inclinada). – ciastek

Cuestiones relacionadas