0

好的,我已经看到了很多关于如何在您的应用程序中使用命名空间时让 Devise 工作的不同答案,但没有一个对我有用。

我将我的应用分成三个命名空间

Home(公共登录页面) Account(用户登录的个人资料/帐户) Admin(尚未编写的管理后台)

我还将所有部分拆分到base每个命名空间中的一个文件夹中。所以我的每个控制器都继承自BaseControllerwhich 继承自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因为设计控制器找不到部分。

4

1 回答 1

1

阅读你的错误!:-)

对于初学者来说,看起来你需要定义一个Account::RegistrationsController,就像你做你的Account::SessionsController.

于 2013-03-03T21:01:53.440 回答