2015-06-26 20 views
5

Tôi đang xây dựng một Rails Engine để xử lý tất cả xác thực và ủy quyền trên nhiều ứng dụng. Tất cả các ứng dụng này đang sử dụng Devise atm để xác thực của chúng. Tôi muốn di chuyển nó vào một động cơ mà sau đó có thể được gắn vào tất cả các ứng dụng này để chúng tự động có tất cả các chức năng tạo ra.Ứng dụng Rails không tìm thấy chức năng Devise khi được gắn từ Engine

Tôi đã làm theo tất cả các bước từ hướng dẫn "Phát triển trong động cơ" trên wiki phát triển. Sự cố Tôi đang chạy đến là tôi không thể sử dụng các chức năng như 'current_user' và 'new_user_session_path' trong bộ điều khiển của các ứng dụng chính của mình.

Các lỗi tôi nhận được trong việc áp dụng chính là:

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 

Động cơ không có một isolate_namespace. Tôi đã thêm Devise làm phụ thuộc vào tệp engine.gemspec và loại bỏ Devise khỏi Gemfile trong ứng dụng chính. Động cơ được gắn kết trong việc áp dụng chính như:

mount Engine::Engine, at: 'idms' 

Ở routes của động cơ i có đưa ra configuered như:

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

các initializers/file devise.rb được như sau:

require 'devise/orm/active_record' 

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

mô hình sử dụng trong động cơ:

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

Im sử dụng Rails 4.2.1 với Devise 3.5.1 trên Ruby 2.2.2.

Câu hỏi của tôi là, làm cách nào để tôi có thể cho phép các bộ điều khiển và chế độ xem trong các chức năng truy cập ứng dụng chính của tôi được thiết lập trong công cụ của tôi?

Mọi trợ giúp đều được chào đón! Tôi đã googling và cố gắng tất cả mọi thứ trong vài ngày qua bây giờ. Cảm ơn mọi người!

EDIT: tuyến Rake cho đầu ra sau đây:

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

Bạn thấy thế nào nếu bạn cào tuyến? –

+0

Tôi đã chỉnh sửa bài đăng của mình bằng đầu ra các tuyến đường rake có liên quan. Cảm ơn! –

Trả lời

2

Bạn cần phải liên kết đến con đường của động cơ. Điều này sẽ cố gắng và đi đến con đường của ứng dụng

link_to t('user.login'), new_user_session_path 

Vì vậy, thay đổi nó để (Tôi nghĩ rằng đây là đúng)

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

Cảm ơn !! Điều này không hoạt động! Có thể làm cho nó ra với con đường egines? Vì vậy, chỉ: _'new_user_session_path'_ Tôi có cần phải sử dụng khởi tạo cho động cơ của tôi? –

+0

Bạn có thể làm một cái gì đó như thế này trong các trang web chính của bạn 'get' sign_in ', để:' devise/sessions # new ', như:' new_user_session'' nhưng các tuyến trùng lặp của bạn và không rõ bạn đang làm gì để tôi 'd tránh nó và chỉ sử dụng đường dẫn động cơ. –

+0

Là một lưu ý cho những người khác, động cơ của tôi cần những điều sau đây cho câu trả lời này để làm việc: id của engine_name 'idms_gem' trong tệp engine.rb của tôi. –

Các vấn đề liên quan