7

グローバル アプリケーション コントローラーが最初に読み込まれると、その名前空間内のページを読み込むときに、名前空間付きのアプリケーション コントローラーは読み込まれません。アプリケーション コントローラは次のようになります。

class ApplicationController < ActionController::Base
 protect_from_forgery
end

名前空間付きのアプリケーション コントローラーは次のようになります。

class Admin::ApplicationController < ApplicationController

def authenticate_admin!
 if current_admin.nil?
  redirect_to new_admin_session_url
 end
end

private

 def current_admin
  @current_admin ||= Admin.find(session[:admin_id]) if session[:admin_id]
 end

helper_method :current_admin
end

before_filter "authenticate_admin!" を使用する場合 このような:

class Admin::AssetsController < Admin::ApplicationController
  before_filter :authenticate_admin!
end

「Admin::AssetsController#new の NoMethodError」がスローされます。これは、名前空間ルートの前にグローバル ルートにヒットした場合にのみ発生します。サーバーが再起動され、名前空間付きルートが最初に読み込まれると、すべてが正常に機能します。

4

2 に答える 2

9

これはAdmin、名前空間と同じ名前のモデル (クラス) もあるために発生しています。

このGoogle グループ スレッドは、正確に何が起こっているのかをよく説明しています。

修正するには、モデルの名前を に変更するAdminUserか、それが可能でない場合は、名前空間の名前を変更することで問題も修正します。

于 2012-06-05T18:41:58.300 に答える
3

名前空間のコントローラーは、正しいディレクトリ構造内に表示される必要があります。

app/controllers/admin/application_controller.rb

app/controllers/admin/assets_controller.rb

個人的にはApplicationController、名前空間付きのベース コントローラーの名前をオーバーロードしないことをお勧めします。これが原因で問題が発生することはありませんが、好みの問題です。アプリケーションは 1 つだけであり、アプリケーションも 1 つだけにする必要がありますApplicationController。それが名前空間ContentManagementControllerの目的である場合に使用できます。Admin

次に、moduleキーワードを使用して、次のようにコントローラーを定義することをお勧めします。

module Admin
  class ContentManagementController < ApplicationController
      # ..
  end
end

# app/controllers/admin/content_management_controller.rb

編集:特定のエラーも見ました(おそらくあなたの質問が更新されましたか?)-新しいアクションを定義する必要がありますAssetsController

def new
   #
end
于 2012-06-05T17:55:00.460 に答える