2012-06-29 7 views
6

Je suis dans le processus de conversion de mon application Rails standard à un moteur montable. L'application est comparable à une application de blogs standard et je veux que chaque modèle, contrôleur et vue soit extensible d'où mon choix pour un moteur montable. L'une des pierres précieuses que j'utilise est Devise qui est aussi loin que je comprends une sorte de moteur montable lui-même. Il peut être utilisé à l'intérieur d'un moteur montable comme indiqué here.Rails montable moteur et dépassant un autre moteur

Je peux l'utiliser partiellement dans mon moteur. Tout fonctionne très bien, y compris certains contrôleur i Override comme Concevoir celui-ci:

# config/routes.rb 

Bbronline::Engine.routes.draw do 
    devise_for :users, class_name: "Bbronline::User", module: :devise, 
    controllers: { registrations: "bbronline/devise_overrides/registrations"} 
    ... 

# controllers/bbronline/devise_overrides/registrations_controller.rb 
require_dependency "bbronline/application_controller" 

module Bbronline 

class DeviseOverrides::RegistrationsController < Devise::RegistrationsController 

    def new_intermediair 
    @user = User.new 
    end 
    ... 

La vue correcte « vues/bbronline/devise_overrides/enregistrement/new_intermediair.html.haml » est également chargé correctement comme prévu.

Cependant, mon problème est que les vues que je redéfinis sans un contrôleur personnalisé ne sont pas correctement chargées. Par exemple, la vue qui doit être la vue de connexion se trouve dans views/bbronline/devise/sessions/new.html.haml et n'est pas chargée. Au lieu de cela, la vue de connexion Devise standard est chargée, c'est-à-dire devise-2.1.0/app/views/devise/sessions/new.html.erb

Bien sûr, je pourrais résoudre ce problème en remplaçant chaque contrôleur par mon propre contrôleur comme je l'ai fait avec le registrations_controller ci-dessus mais cela semble très moche. Est-ce que le remplacement de chaque contrôleur est le moyen de le faire? Existe-t-il un moyen plus pratique de remplacer les vues d'un moteur montable à partir d'un autre moteur montable?

Répondre

4

Les view_paths sont dans un ordre incorrect. Vérification des chemins de vue de SessionsController :: montre Devise:

Devise::SessionsController.view_paths 
=> #<ActionView::PathSet:0x007fa1bf0e36f8 @paths= [/Users/harmdewit/Dropbox/Code/projects/brightin/bbr-online/bbr-online-gem/test/‌​dummy/app/views, 
/Users/harmdewit/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/devise-2.1.‌​0/app/views, 
/Users/harmdewit/Dropbox/Code/projects/brightin/bbr-online/bbr-online-gem/app/vi‌​ews]> 

Le dernier chemin du moteur doit être monté devant le chemin DEVISE milieu. La solution est mise la priorité de chargement dans application.rb comme ceci:

#test/dummy/config/application.rb (the app that uses my mountable engine) 
... 
config.railties_order = [Blog::Engine, :main_app, :all] 
... 

Ceci est également documenté dans les rails api: http://api.rubyonrails.org/classes/Rails/Engine.html#label-Loading+priority

Merci à José Valim pour pointer dans la bonne direction.

+2

De toute façon je pourrais faire ce changement sans avoir à changer la configuration de mon application fictive? Je préférerais en faire le comportement par défaut chaque fois que je chargerai ma gemme. – Ajedi32

1

J'ai besoin de plus d'informations. Quel contrôleur définissez-vous et de quel contrôleur hérite-t-il? Quelle vue est rendue et laquelle espériez-vous rendre? En outre, .view_paths est votre ami alors essayez dans votre console rails suivants:

Devise::SessionsController.view_paths 
YourApp::SomeDeviseController.view_paths 

Cela vous donnera une meilleure idée de l'endroit où chaque contrôleur est à la recherche de modèles.

+0

Je ne définis pas un contrôleur, je veux juste remplacer la vue. Plus précisément, je veux remplacer la vue située dans 'concevoir-2.1.0/app/vues/devise/sessions/new.html.erb' sans surcharger le contrôleur. Est-ce possible? –

+0

Oh montre .view_paths: Devise :: SessionsController.view_paths => # Bbronline :: SessionsController n'existe pas bien sûr, je ne le remplace pas –

+1

Si vous ne voulez pas utiliser un contrôleur personnalisé, remplacez simplement le vue, placez votre nouvelle vue sur: 'your-engine/app/vues/devise/sessions/new.html.erb' et assurez-vous que le moteur de Devise est chargé avant votre moteur montable (juste besoin de concevoir avant). Encore une fois, l'appel '.view_paths' dans votre' Devise.parent_controller' ou dans votre contrôleur d'application vous dira l'ordre de recherche de modèle. –

7

Si vous ne voulez pas régler la config.railties_order dans chaque application qui utilise votre moteur, juste require 'devise' sur le dessus de votre lib \ my_engine \ engine.rb fichier.

+1

Yay, ça a marché! +1 – Ajedi32

+1

Alors que les autres réponses offrent un aperçu de l'exploration des view_paths, voici la réponse si votre moteur est destiné au chargement et à la personnalisation d'autres moteurs – prusswan

+0

a sauvé ma vie = D –

Questions connexes