2012-05-23 10 views
9

Estoy construyendo un motor de Rails llamado Engrave.Falta el diseño de las rutas de ayuda dentro de las vistas de los rieles del motor

Tengo el motor montado de esta manera:

# Routes.rb of the host app 
mount Engrave::Engine => "/engrave", :as => "engrave_engine" 

Dentro de este motor Tengo un controlador llamado "PostsController". Cuando Navegación a este controlador para ver un puesto de este modo: /engrave/posts/1 consigo este error:

undefined local variable or method `new_user_session_path' 

El PostsController en el motor está heredando desde el controlador de motor, que se hereda desde el controlador de aplicación, así:

module Engrave 
    class PostsController < ApplicationController 
    ... 
end 

class Engrave::ApplicationController < ApplicationController 
end 

El new_user_session_path está siendo definido por legado, que he fijado como:

devise_for :users 

La llamada a new_user_session_path está en el archivo de plantilla layouts/application.html.erb en la aplicación de host

No puedo entender por qué este asistente de ruta no está disponible en este contexto. ¿Qué estoy haciendo mal?

+0

He marcado la respuesta de StrangeDays como correcta, porque técnicamente soluciona el problema, pero si alguien tiene una idea de cómo usar un motor de esta manera sin requerir la modificación de todas mis plantillas de diseño, sería increíble. Jugué y logré lo que quería creando un motor completo en lugar de uno aislado/montable. Creo que todavía me estoy perdiendo algo, quiero tener mi pastel y comerlo también en este. – Jeff

Respuesta

9

Uso

main_app.new_user_session_path

que debería funcionar

6

He tenido éxito haciendo lo siguiente en application_helper.rb de la aplicación principal:

module ApplicationHelper 
    # Can search for named routes directly in the main app, omitting 
    # the "main_app." prefix 
    def method_missing method, *args, &block 
    if main_app_url_helper?(method) 
     main_app.send(method, *args) 
    else 
     super 
    end 
    end 

    def respond_to?(method) 
    main_app_url_helper?(method) or super 
    end 

private 

    def main_app_url_helper?(method) 
    (method.to_s.end_with?('_path') or method.to_s.end_with?('_url')) and 
     main_app.respond_to?(method) 
    end 
end 

que he usado esto en motores montables, para que no tenga que sacrificar esas características.

0

Trabajar fuera de this response, incluyo todos los ayudantes que se encuentran en application_helpers.rb al afirmar helper "manager/application" dentro del controlador (si 'administrador' es el espacio de nombres actual de su motor montable. Sólo tiene que utilizar 'aplicación' si está llamando a esto desde una aplicación estándar).

Cuestiones relacionadas