2015-06-26 4 views
5

Ich baue eine Rails Engine, um die gesamte Authentifizierung und Autorisierung über mehrere Anwendungen hinweg durchzuführen. Alle diese Anwendungen verwenden Devise atm für ihre Authentifizierung. Ich möchte dies in eine Engine verschieben, die dann in all diesen Anwendungen installiert werden kann, so dass sie automatisch alle Gerätefunktionen haben.Die App "Schienen" findet keine Devise-Funktionen, wenn sie von der Engine bereitgestellt wird

Ich folgte alle Schritte aus dem "Devise in a engine" Guide auf dem Devise Wiki. Das Problem Ich renne in ist, dass ich Funktionen wie 'current_user' und 'new_user_session_path' in den Controllern meiner Hauptanwendungen nicht verwenden kann.

Der Fehler, ich bin in der Hauptanwendung bekommen ist:

Showing .../main_app/app/views/shared/_header.haml where line #19 raised: 
undefined local variable or method `new_user_session_path' for #<#<Class:0x007f1578968040>:0x007f157897b348> 

= link_to t('user.login'), new_user_session_path 

Der Motor keine isolate_namespace hat. Ich habe Devise als Abhängigkeit in der Datei engine.gemspec hinzugefügt und Devise aus der Gemfile in der Hauptanwendung entfernt. Der Motor ist in der Hauptanwendung montiert, wie:

mount Engine::Engine, at: 'idms' 

In den Routen des Motors i ersinnen haben configuered wie:

devise_for :users, { 
    class_name: "IdmsGem::User", 
    module: :devise 
    controllers: { sessions: "devise/sessions" } 
} 

Die initializers/devise.rb Datei wird wie folgt:

require 'devise/orm/active_record' 

Devise.setup do |config| 
    config.router_name = '/idms_gem' 
end 

Das Modell Benutzer im Motor:

module Engine 
    class User < ActiveRecord::Base 
    devise :database_authenticatable 
    self.table_name = "users" 
    end 
end 

Ich benutze Rails 4.2.1 mit Devise 3.5.1 auf Ruby 2.2.2.

Meine Frage ist, wie kann ich meine Controller und Ansichten in meinen Hauptanwendungen zugreifen Funktionen von Devise, die in meiner Engine konfiguriert ist?

Jede Hilfe ist willkommen! Ich habe in den letzten paar Tagen gegoogelt und alles versucht. Danke jeder!

EDIT: Rake Routen geben die folgende Ausgabe:

Prefix Verb URI Pattern        Controller#Action 
idms_gem  /idms          IdmsGem::Engine 

{AND THE REST OF MY MAIN APP ROUTES...} 

Routes for IdmsGem::Engine: 
    new_user_session GET /users/sign_in(.:format) devise/sessions#new 
     user_session POST /users/sign_in(.:format) devise/sessions#create 
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy 
       root GET /      devise/sessions#new 
+0

Was sehen Sie, wenn Sie Routen rechen? –

+0

Ich habe meinen Post mit den relevanten Rake-Routen bearbeitet. Vielen Dank! –

Antwort

2

Sie müssen den Motor Pfad zu verbinden. Dies wird versuchen, und gehen Sie auf den Pfad der Anwendung

link_to t('user.login'), new_user_session_path 

ändern Sie es so zu (ich glaube, dieses Recht)

link_to t('user.login'), IdmsGem.new_user_session_path 
+0

Danke !! Das funktioniert! Ist es möglich, den Egines-Pfad zu verlassen? Also nur: _'new_user_session_path'_ Müsste ich Initialisierungen für meine Engine verwenden? –

+0

Sie könnten so etwas in Ihren Hauptwebsites routes 'get 'sign_in' machen, zu: 'devise/sessions # new', wie: 'new_user_session'' aber Ihre Duplierrouten und es ist nicht klar, was Sie tun imo, also ich Meide es und nutze einfach den Motorweg. –

+0

Als eine Anmerkung für andere, meine Maschine benötigt folgende für diese Antwort zu arbeiten: Engine-Name 'IDMS_GEM' in meiner Engine.RB-Datei. –