2011-09-28 6 views
8

? Necesito saber, desde el interior de un diseño de motor montable, en qué camino se está montando actualmente. ¿Cuál sería la forma de hacerlo?¿Qué camino se monta un motor montado en

E.g. mi routes.rb contiene la línea siguiente:

mount BackendCore::Engine => "/backend" 

Desde el interior de la BackendCore, necesito el acceso al valor de "/ backend".

+0

posible duplicado de [Reverse carriles de enrutamiento: encuentre el nombre de la acción de la URL] (http://stackoverflow.com/questions/3481731/reverse-rails-routing-find-the-the-action-name-from-the-url) –

+1

El enlace que proporciona lo hace no ayuda mucho, ya que no tiene referencias a los motores, aunque da una dirección para buscar en. – mxgrn

Respuesta

8

ACTUALIZACIÓN: ¡esto probablemente solo se aplica a Rails 3!

he encontrado la solución:

Rails.application.routes.named_routes[:backend_core].path #=> "/backend" 
+1

Gracias amigo, este realmente me ayudó :) –

9

Si el motor está mouted :as => un nombre diferente, consultar named_routes no será suficiente. Este parche mono hará:

class Rails::Engine 
    def self.mounted_path 
    route = Rails.application.routes.routes.detect do |route| 
     route.app == self 
    end 
    route && route.path 
    end 
end 

ahora la palabra mounted_path en el motor:

BackendCore::Engine.mounted_path => "/backend" 

Nota: tenga cuidado, en el modo de producción, las clases en su motor se evalúan antes que las rutas de la aplicación principal están cargados ¡Llamar a este método en macros de clase podría no funcionar!

+0

Usando esta técnica en Rails 4 Engines. ¡Gracias! – RailinginDFW

3

La evaluación de las rutas para obtener la ruta de montaje puede dar resultados inesperados cuando los motores se montan dentro de otros motores.

Al echar un vistazo a https://github.com/rails/rails/pull/5008 se puede leer el comentario de José Valim:

Además, un motor puede ser montado dentro de otro motor, por lo que es poco probable que esto le dará el resultado correcto. La mejor opción es, probablemente, tener una opción de configuración donde el desarrollador establecerá la ruta.

Para resultados consistentes, ahora estoy usando un accesorio en el motor.

Por ejemplo:

# APP/initializers/backend_core_engine.rb 
BackendCore::Engine.mount_path = "/backend" 

# APP/config/routes.rb 
mount BackendCore::Engine => BackendCore::Engine.mount_path 

# ENGINE/backend_core/lib/engine.rb 
module BackendCore 
    class Engine < ::Rails::Engine 
    cattr_accessor :mount_path 
    end 
end 
-1

Usted puede simplemente utilizar el código siguiente para indicar qué motor de ruta es el monte para dentro de un controlador de motor/foto:

env["SCRIPT_NAME"] # => "/backend" 
+0

Sólo curiosidad, ¿por qué esto es downvoted? –

+0

no sé :(no hay comentarios y tengo un voto negativo :( –

+0

No debería ser posible obtener un voto sin explicación. ¿Cómo puedo confiar si ese voto a favor tiene sentido o no? –

Cuestiones relacionadas