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
我正在构建一个 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