2015-07-30 6 views
8

Ich habe eine Rails Engine, die ich ein Layout aus der Container-Anwendung freigeben möchte. Ich möchte alle URL-Helfer aus den Layouts der Haupt-App unterstützen, um die Integration trivial zu machen. Das ist Layout mit Helfern aus dem Behälter App zu unterstützen:Rails Engine mit isoliertem Namespace Freigeben eines Layouts

= link_to "Signup", new_user_path 
= link_to "Login", new_user_path 
... 

Dies verursacht:

undefined lokale Variable oder Methode `new_user_path‘ für # < #: 0x007f9bf9a4a168>

I kann es beheben, indem Sie die application.html (in der Container-App) wie folgt ändern:

= link_to "Signup", main_app.new_user_path 
= link_to "Login", main_app.new_user_path 

Aber das Ziel ist es, es so zu machen, dass die Integration der Engine nicht erfordert, dass Benutzer Änderungen an der bestehenden Funktion vornehmen application.html.

Ich glaube, ich kann auch die Fehler beheben, indem Sie isolate_namespace Example von lib/example/engine.rb entfernen, aber das bricht fast alles in der Engine.

Irgendeine Möglichkeit, Container-App-Helfer und explizit Namespace meine Motoren Helfer zu ermöglichen, Konflikte zu vermeiden? (d. h. unter Verwendung von example.root_path anstelle von root_path)?

Antwort

0

Werfen Sie einen Blick auf diese: https://github.com/rails/rails/blob/a690207700d92a1e24712c95114a2931d6197985/actionpack/lib/abstract_controller/helpers.rb#L108

Sie können Ihre Helfer aus Ihrem Motor in Ihrer Host-Anwendung enthalten.

module Blargh 
    class Engine < ::Rails::Engine 
    isolate_namespace Blargh 

    config.to_prepare do 


     # application helper 
     ApplicationController.helper(Blargh::ApplicationHelper) 
     # any other helper 
    end 
    end 
end 

Auf diese Weise können Sie Ihren Helfer in Ihrem Rails-Host ohne Probleme verwenden. Natürlich gibt es keinen richtigen Namespacing auf diese Weise. Wenn also ein Nutzer Ihrer Engine eine neue Hilfsmethode wie Ihre Hilfsmethode benennt, kommt es zu einem Konflikt.

Beantwortet das Ihre Frage?

Verwandte Themen