7

Quando il controller dell'applicazione globale viene caricato per primo, il controller dell'applicazione con spazio dei nomi non viene caricato durante il caricamento di pagine all'interno di tale spazio dei nomi. Il controller di applicazione si presenta così:Rails 3.2.3 controller con nomi assegnati sovrascritti dai controller globali con lo stesso nome

class ApplicationController < ActionController::Base 
protect_from_forgery 
end 

E il controller dell'applicazione namespace assomiglia a questo: "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 

Quando usiamo la before_filter In questo modo:

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

Viene generato un "NoMethodError in Admin :: AssetsController # new". Ciò si verifica solo quando raggiungiamo la rotta globale prima del percorso con nomi. Se il server viene riavviato e il percorso dei nomi viene caricato per primo, tutto funziona correttamente.

+0

In che file si trovano questi controller? –

+0

app/controller/admin/application_controller.rb, app/controller/admin/assets_controller.rb e app/controller/application_controller.rb –

risposta

9

Questo accade perché anche vi capita di avere un modello Admin (una classe) con lo stesso nome di spazio dei nomi.

This Il thread di gruppo di Google fornisce una buona spiegazione di cosa sta succedendo esattamente.

Per risolvere il problema, rinominare il modello in AdminUser oppure, se questa non è una possibilità, anche la ridenominazione dello spazio dei nomi risolverà il problema.

3

I controller con spazio dei nomi devono apparire all'interno della struttura di directory corretta.

app/controllers/admin/application_controller.rb

app/controllers/admin/assets_controller.rb

Personalmente, vorrei consigliare contro di sovraccaricare il nome ApplicationController per un controller di base namespace. Questo non causerebbe il problema, ma è una questione di preferenza - c'è solo una domanda e dovrebbe esserci solo una ApplicationController. È possibile utilizzare ContentManagementController se questo è lo scopo dello spazio dei nomi Admin.

secondo luogo, è meglio la pratica di utilizzare la parola chiave module e definire i controller in questo modo:

module Admin 
    class ContentManagementController < ApplicationController 
     # .. 
    end 
end 

# app/controllers/admin/content_management_controller.rb 

edit: ho anche appena visto l'errore specifico (? Forse la tua domanda è stato aggiornato) - è necessario definire la nuova azione sul AssetsController

def new 
    # 
end 
+0

Mi spiace di non averlo menzionato prima; i controller sono nella struttura di directory corretta, denominata esattamente come hai dichiarato. Abbiamo azioni in AssetsController, semplicemente non le abbiamo inserite nel post originale in quanto non sembra rilevante. –

Problemi correlati