使用Devise Gem命名空间抛出ActionController :: RoutingError

时间:2013-03-03 18:11:42

标签: ruby-on-rails devise namespaces ruby-on-rails-3.2

好的,我在应用程序中使用命名空间时看到了大量不同的答案,但是没有一个能为我工作。

我的应用程序分为三个命名空间

主页(公共目标网页) 帐户(用户登录的个人资料/帐户) 管理员(尚未编写的管理员后端)

我还将所有部分分成每个命名空间中的base文件夹。因此,我的每个控制器都继承自BaseController

继承的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",但我没有在帐户控制器中指定layout "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的文件夹中。如this RailsCast

所示

如果我没有加入BaseController,我会得到一个丢失的部分错误,因为设计控制器无法找到部分错误。

1 个答案:

答案 0 :(得分:1)

阅读你的错误! : - )

首先,看起来您需要定义Account::RegistrationsController,就像您Account::SessionsController一样。