Rails 应用程序在从引擎安装时找不到 Devise 函数

Rails app not finding Devise functions when mounted from Engine

我正在构建一个 Rails 引擎来处理跨多个应用程序的所有身份验证和授权。所有这些应用程序都使用 Devise atm 进行身份验证。我想将其移动到一个引擎中,然后可以将其安装在所有这些应用程序中,以便它们自动具有所有设计功能。

我遵循了设计维基上 "Devise in an engine" 指南中的所有步骤。 我 运行 遇到的问题 是我无法使用“current_user”和“ new_user_session_path' 在我的主要应用程序的控制器中。

我在主应用程序中遇到的错误是:

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

引擎没有 isolate_namespace。我将 Devise 添加为 engine.gemspec 文件中的依赖项,并从主应用程序的 Gemfile 中删除了 Devise。引擎在主应用程序中安装为:

mount Engine::Engine, at: 'idms'

在我设计的引擎路径中配置为:

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

initializers/devise.rb文件如下:

require 'devise/orm/active_record'

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

引擎中的用户模型:

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

我在 Ruby 2.2.2.

上使用 Rails 4.2.1 和 Devise 3.5.1

我的问题是,我怎样才能让我的控制器和主要应用程序中的视图访问我引擎中配置的设备的功能?

欢迎任何帮助!在过去的几天里,我一直在谷歌搜索并尝试每件事。 谢谢大家!

编辑: Rake routes 给出以下输出:

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

您需要link到引擎的路径。这将尝试转到应用程序的路径

link_to t('user.login'), new_user_session_path

所以改成(我觉得这样就对了)

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