2012-05-23 7 views
9

Ich baue eine Rails-Engine namens Engrave.Missing devise routes helpers innerhalb von Schienen engine views

Ich habe den Motor wie so montiert:

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

In diesem Motor ich einen Controller namens "Posts". Wenn ich an diesen Controller navigieren wie einen Beitrag sehen so: /engrave/posts/1 bekomme ich diesen Fehler:

undefined local variable or method `new_user_session_path' 

Der Posts im Motor von der Motorsteuerung erbt, die von der Anwendungssteuerung erbt, etwa so:

module Engrave 
    class PostsController < ApplicationController 
    ... 
end 

class Engrave::ApplicationController < ApplicationController 
end 

Die new_user_session_path von devise definiert wird, was ich habe Setup wie:

devise_for :users 

Der Aufruf von new_user_session_path ist in der layouts/application.html.erb Vorlagendatei in der Host-App

Ich kann nicht herausfinden, warum diese Route Helfer in diesem Zusammenhang nicht verfügbar ist. Was mache ich falsch?

+0

Ich habe StrangeDays als richtig markiert, weil es technisch das Problem behebt, aber wenn jemand eine Idee davon hat, wie man eine Engine auf diese Weise verwendet, ohne dass ich alle meine Layout-Vorlagen ändern müsste, wäre das großartig. Ich spielte herum und schaffte es, das zu erreichen, was ich wollte, indem ich eine vollständige Engine anstelle einer isolierten/montierbaren Engine erstellte. Ich glaube, mir fehlt noch etwas, ich möchte meinen Kuchen essen und es auch hier essen. – Jeff

Antwort

9

Verwenden

main_app.new_user_session_path

, die funktionieren sollte

6

ich Erfolg gehabt haben in den wichtigsten App application_helper.rb wie folgt vorgehen:

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 

ich verwendet habe, dies in montierbaren Engines, so dass Sie diese Funktionen nicht opfern müssen.

0

Arbeiten aus dem this response, ich bin alle in application_helpers.rb gefunden Helfer von helper "manager/application" im Controller unter Angabe (falls ‚Manager‘ die aktuelle Namespace des montierbaren Motors ist. Nur ‚Anwendung‘ verwenden, wenn Sie diese von einem anrufen Standardanwendung).