2010-11-19 11 views
25

usando un método: layout_for_namespace Establecí el diseño de mi aplicación dependiendo de si estoy en frontend o back-end, ya que el backend usa un espacio de nombres "admin".Rails 3: ¿Obtener el espacio de nombres actual?

No pude encontrar una forma bonita de averiguar qué espacio de nombres soy, la única forma que encontré es mediante el análisis de la cadena de parámetros [: controlador]. Por supuesto que es fácil, parece ser a prueba de fallos y funciona bien. Pero me pregunto si hay una forma mejor y preparada para hacer esto. ¿Alguien sabe?

Actualmente sólo estoy usando el siguiente método:

def is_backend_namespace? 
    params[:controller].index("admin/") == 0 
end 

Gracias de antemano

Arne

Respuesta

12

No mucho más elegante, sino que utiliza la clase en lugar del hash params. No estoy al tanto de una forma "preparada" de hacer esto sin un análisis sintáctico.

self.class.to_s.split("::").first=="Admin" 
+0

Hola. Eso no es lo que quise decir, lo siento. El nombre del controlador es otra cosa, "admin" es el espacio de nombres. Es Admin :: MyController, por lo que params [: controller] da "admin/my_controller" o algo así, ahí es donde comprobo si es el espacio de nombres de administración. Usar controller_name debería hacer exactamente lo mismo, pero me gustaría saber cómo no _parse_ it pero recuperar el espacio de nombres solamente. – arnekolja

+0

Mi error, no leí la pregunta de cerca. Usted indica claramente el espacio de nombre y no el nombre del controlador. Respuesta actualizada con una alternativa. – johnmcaliley

+2

Más simplemente 'controller.class.name.start_with? ('Admin')'. –

25

Fuera del controlador (por ejemplo, en las vistas), use controller.class.name. Usted puede convertir esto en un método de ayuda como esto:

module ApplicationHelper 
    def admin? 
    controller.class.name.split("::").first=="Admin" 
    end 
end 
+0

Gracias. Es una solución simple y fácil de usar, especialmente cuando necesita verificar el espacio de nombres en 'Vistas'. –

+2

también en las vistas puede usar controller.class.parent.name – engineerDave

+0

cómo llamar esto desde la vista? –

14

En tanto el controlador y las vistas, puede analizar controller_path, por ejemplo .:

namespace = controller_path.split('/').first 
+0

esto da '' foo'' de vuelta si digo ''foo'.split ('/'). First'. Una solución sería mejor si el espacio de nombres es 'nil' cuando se comprueba un nombre de controlador sin nombre – Cristian

6

Ajuste del espacio de nombres en el controlador de aplicación:

path = self.controller_path.split('/') 
@namespace = path.second ? path.first : nil 
+2

Esto obviaría el ternario: @namespace = (path.first if path.second) – parndt

8

Ninguna de estas soluciones considera una constante con varios módulos principales. Por ejemplo:

A::B::C 

A partir de Rails 3.2.x puede simplemente:

"A::B::C".deconstantize #=> "A::B" 

A partir de Rails 3.1.x puede:

constant_name = "A::B::C" 
constant_name.gsub("::#{constant_name.demodulize}", '') 

Esto se debe a #demodulize es la opuesto a #deconstantize:

"A::B::C".demodulize #=> "C" 

Si realmente necesita hacer esto manualmente, intente esto:

constant_name = "A::B::C" 
constant_name.split('::')[0,constant_name.split('::').length-1] 
+1

Esta debería ser la respuesta aceptada. – GMA

33

que puede utilizar:

self.class.parent == Admin 
+1

¡esta respuesta debería ser la primera! –

+1

Acepto, esta debería ser la respuesta aceptada. – mysmallidea

+6

Como muchos han señalado, esto no funciona para las clases que tienen múltiples niveles de espacio de nombres. Sin embargo, si solo está revisando para ver si se encuentra en dicho espacio de nombres (como el tipo de OP), puede usar 'controller.class.parents.include? (Admin)' y obtener lo similar sin tener que recurrir al análisis de cadenas – trcarden

Cuestiones relacionadas