7

Cuando se carga primero el controlador de aplicación global, el controlador de aplicación de espacio de nombres no se carga al cargar páginas dentro de ese espacio de nombres. El controlador de aplicación es el siguiente:Rails 3.2.3 Controles de espacio de nombres reemplazados por controladores globales con el mismo nombre

class ApplicationController < ActionController::Base 
protect_from_forgery 
end 

y el controlador de la aplicación de espacios de nombres tiene este aspecto: "! 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 

Cuando usamos la before_filter de esta manera:

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

Se genera un "NoMethodError en Admin :: AssetsController # new". Esto solo ocurre cuando alcanzamos la ruta global antes de la ruta del espacio de nombres. Si se reinicia el servidor y se carga la ruta de espacio de nombres, todo funciona correctamente.

+0

¿En qué archivos están estos controladores? –

+0

aplicación/controladores/admin/application_controller.rb, aplicación/controladores/admin/assets_controller.rb y aplicación/controladores/application_controller.rb –

Respuesta

9

Esto está ocurriendo porque también sucede que tiene un modelo Admin (una clase) con el mismo nombre que su espacio de nombres.

This El hilo de grupo de Google proporciona una buena explicación de lo que está sucediendo exactamente.

Para corregirlo, cambiaría el nombre del modelo a AdminUser o, si eso no es posible, el cambio de nombre del espacio de nombres también solucionará el problema.

3

Los controladores con nombres de nombres deben aparecer dentro de la estructura de directorios correcta.

app/controllers/admin/application_controller.rb

app/controllers/admin/assets_controller.rb

En lo personal, yo le aconsejaría contra sobrecarga el nombre ApplicationController para un controlador de base de espacios de nombres. Esto no estaría causando el problema, pero es una cuestión de preferencia: solo hay una aplicación, y solo debe haber una ApplicationController. Puede usar ContentManagementController si ese es el propósito del espacio de nombre Admin.

En segundo lugar, es mejor la práctica de utilizar la palabra clave module y definir los controladores de esta manera:

module Admin 
    class ContentManagementController < ApplicationController 
     # .. 
    end 
end 

# app/controllers/admin/content_management_controller.rb 

editar: Yo también acabo de ver el error específico (? Quizá se actualiza su pregunta) - es necesario definir la nueva acción en la AssetsController

def new 
    # 
end 
+0

Lo siento, no lo mencioné antes; los controladores están en la estructura de directorios correcta, nombrada exactamente como usted indicó. Tenemos acciones en AssetsController, simplemente no las pusimos en la publicación original porque no parecían relevantes. –

Cuestiones relacionadas