ror restful rails ruby-on-rails ruby-on-rails-3 namespaces actioncontroller

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