好的,我已经看到了很多关于如何在您的应用程序中使用命名空间时让 Devise 工作的不同答案,但没有一个对我有用。
我将我的应用分成三个命名空间
Home(公共登录页面) Account(用户登录的个人资料/帐户) Admin(尚未编写的管理后台)
我还将所有部分拆分到base
每个命名空间中的一个文件夹中。所以我的每个控制器都继承自BaseController
which 继承自ApplicationController
:
module Account
class UsersController < BaseController
end
end
我sessions_controller.rb
在帐户和家庭中创建了一个从设计会话控制器继承的帐户,如下所示:
module Account
class SessionsController < BaseController < Devise::SessionsController
end
end
目标是在 Home 命名空间中有一个登录/注册表单,让用户登录到帐户命名空间中的用户控制器。
现在,当我单击以下生成的链接时:
<%= link_to "register", new_user_registration_path %>
我越来越
ActionController::RoutingError at /users/sign_up
uninitialized constant Account::RegistrationsController
我的 routes.rb 文件如下所示:
scope :module => "account" do
devise_for :users, :controllers => { :sessions => "account/sessions" }
resource :users
end
scope :module => "home" do
resources :home, :about, :jobs, :terms, :privacy, :android_availability, :about, :contact
end
get "home/index"
root :to => 'home::home#index'
end
主控制器使用主布局,帐户控制器使用应用程序布局。我layout "home"
在 home 控制器中指定,但我没有layout "application"
在帐户控制器中指定,因为 application 是 rails 查找的默认布局。
好的。我想我已经覆盖了我所有的基础。知道我在这里做错了什么吗?
谢谢!
编辑:
好的,我已经以与上述文件registrations_controller.rb
相同的方式将sessions_controller.rb
文件添加到帐户命名空间。
我还更新了routes.rb
文件:
scope :module => "account" do
devise_for :users, :controllers => {
:sessions => "account/sessions",
:registrations => "account/registrations" }
resource :users
end
现在我遇到了一个我不明白的新错误。这里是:
NoMethodError at /users/sign_up
undefined method `action' for Account::RegistrationsController:Class
它说未定义的方法“动作”在(gem) actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb
其中没有任何意义。
具体来说就是说问题出在这里:
def dispatch(controller, action, env)
controller.action(action).call(env)
end
编辑2:
这是我的代码registrations_controller.rb
module Account
class RegistrationsController < BaseController < Devise::RegistrationsController
end
end
编辑 3:
module Account
class BaseController < ApplicationController
end
end
好的,上面是我的base_controller.rb
,它只是继承自ApplicationController
. 所有其他控制器都继承自BaseController
. 因为我已将我的应用程序拆分为三个命名空间,所以 base_controller 用于告诉命名空间中的其他控制器,这些部分base
位于其命名空间内命名的文件夹中。如本 RailsCast所示
如果我不包含,我会收到一个丢失的部分错误,BaseController
因为设计控制器找不到部分。