ruby on rails - restful - Rieles 3: ¿Obtener espacio de nombres actual?
routes in ruby on rails (6)
usando un método: layout_for_namespace Yo configuro el diseño de mi aplicación dependiendo de si estoy en el frontend o en el backend, ya que el backend usa un espacio de nombres "admin".
No pude encontrar una manera bonita de descubrir 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 estar a prueba de fallas y funciona bien. Pero me pregunto si hay una forma mejor y mejor preparada para hacer esto. ¿Alguien sabe?
Actualmente estoy usando el siguiente método:
def is_backend_namespace?
params[:controller].index("admin/") == 0
end
Gracias por adelantado
Arne
Configuración del espacio de nombres en el controlador de la aplicación:
path = self.controller_path.split(''/'')
@namespace = path.second ? path.first : nil
Fuera del controlador (por ejemplo, en las vistas), use controller.class.name. Puedes convertir esto en un método de ayuda como este:
module ApplicationHelper
def admin?
controller.class.name.split("::").first=="Admin"
end
end
Ninguna de estas soluciones considera una constante con múltiples 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 que #demodulize es lo opuesto a #deconstantize:
"A::B::C".demodulize #=> "C"
Si realmente necesitas hacer esto manualmente, prueba esto:
constant_name = "A::B::C"
constant_name.split( ''::'' )[0,constant_name.split( ''::'' ).length-1]
No mucho más elegante, pero usa la clase en lugar del hash params. No tengo conocimiento de una forma "preparada" de hacer esto sin un análisis.
self.class.to_s.split("::").first=="Admin"
Puedes usar:
self.class.parent == Admin
Tanto en el controlador como en las vistas, puede analizar controller_path, por ejemplo:
namespace = controller_path.split(''/'').first