7

Wenn der globale Anwendungscontroller zuerst geladen wird, wird der Namespace-Anwendungscontroller nicht geladen, wenn Seiten in diesen Namespace geladen werden. Der Applikations-Controller sieht wie folgt aus:3.2.3 Namespace-Controller, die von globalen Controllern mit demselben Namen überschrieben werden

class ApplicationController < ActionController::Base 
protect_from_forgery 
end 

Und der Namespaced Anwendung Controller sieht wie folgt aus: "authenticate_admin"

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 

Wenn wir die before_filter verwenden wie folgt:

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

Ein "NoMethodError in Admin :: AssetsController # new" wird ausgelöst. Dies tritt nur auf, wenn wir die globale Route vor der Namespace-Route treffen. Wenn der Server neu gestartet wird und die Namespace-Route zuerst geladen wird, funktioniert alles ordnungsgemäß.

+0

In welchen Dateien befinden sich diese Controller? –

+0

app/controllers/admin/application_controller.rb, app/controllers/admin/assets_controller.rb und app/controllers/application_controller.rb –

Antwort

9

Dies geschieht, weil Sie auch ein Admin Modell (eine Klasse) mit dem gleichen Namen wie Ihr Namensraum passieren lassen.

This Google Gruppen-Thread bietet eine gute Erklärung, was genau passiert.

Um zu beheben, würde ich entweder das Modell in umbenennen oder wenn das keine Möglichkeit ist, das Umbenennen des Namespace wird auch das Problem beheben.

3

Namespace-Controller müssen in der richtigen Verzeichnisstruktur angezeigt werden.

app/controllers/admin/application_controller.rb

app/controllers/admin/assets_controller.rb

Persönlich würde ich davon abraten, den ApplicationController Name für einen Namespaced Basis-Controller zu überlasten. Dies würde nicht das Problem verursachen, aber es ist eine Frage der Präferenz - es gibt nur eine Anwendung, und es sollte nur eine ApplicationController sein. Sie könnten ContentManagementController verwenden, wenn dies der Zweck des Admin-Namespace ist.

Zweitens ist es besser Praxis die module Schlüsselwort zu verwenden und Ihre Controller auf diese Weise definieren:

module Admin 
    class ContentManagementController < ApplicationController 
     # .. 
    end 
end 

# app/controllers/admin/content_management_controller.rb 

edit: ich auch den spezifischen Fehler sah nur (? Vielleicht Ihre Frage wurde aktualisiert) - Sie müssen definiert die neue Aktion auf den AssetsController

def new 
    # 
end 
+0

Sorry, ich habe es vorher nicht erwähnt; Die Controller befinden sich in der korrekten Verzeichnisstruktur und werden genau wie angegeben benannt. Wir haben Aktionen im AssetsController, wir haben sie einfach nicht in den ursprünglichen Post geschrieben, da dies nicht relevant erschien. –