0

わかりました。アプリで名前空間を使用するときにDeviseを機能させる方法については、さまざまな答えを見てきましたが、どれもうまくいきません。

アプリを3つの名前空間に分割しています

ホーム(公開ランディングページ)アカウント(ログインしているユーザーのプロファイル/アカウント)管理者(まだ作成されていない管理者バックエンド)

また、すべてのパーシャルをbase各名前空間のフォルダーに分割しました。したがって、私の各コントローラーは、 :BaseControllerから継承するから継承します。ApplicationController

   module Account
      class UsersController < BaseController
      end
   end 

そして、私はsessions_controller.rb次のようにデバイスセッションコントローラーから継承するアカウントとホームの両方でを作成しました。

module Account
  class SessionsController < BaseController < Devise::SessionsController
  end
end

目標は、ユーザーがアカウント名前空間にあるユーザーコントローラーにログインできるようにするログイン/登録フォームをホーム名前空間に含めることです。

今、私が生成したリンクをクリックすると、次のようになります。

<%= 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"

Ok。私はすべての拠点をカバーしたと思います。私がここで間違っていることについて何か考えはありますか?

ありがとう!

編集:

上記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ます。アプリを3つの名前空間に分割したので、base_controllerは、名前空間内の他のコントローラーに、パーシャルがbase名前空間内の名前付きフォルダーにあることを通知するためにあります。このRailsCastに示されているように

BaseControllerを含めないと、デバイスコントローラーがパーシャルを見つけることができないため、パーシャルが見つからないというエラーが発生します。

4

1 に答える 1

1

エラーを読んでください!:-)

Account::RegistrationsController手始めに、あなたがあなたがしたのと同じ方法で、あなたがを定義する必要があるように見えますAccount::SessionsController

于 2013-03-03T21:01:53.440 に答える