Ответ 1
Вы можете использовать:
self.class.parent == Admin
с помощью метода: layout_for_namespace Я установил свой макет приложения в зависимости от того, есть ли я в интерфейсе или бэкэнд, поскольку бэкэнд использует пространство имен "admin".
Я не мог найти красивый способ узнать, какое пространство имен я есть, единственный способ, которым я нашел, - это разбор строки из params [: controller]. Конечно, это легко, кажется, отказоустойчиво и работает хорошо. Но мне просто интересно, есть ли лучший, подготовленный, способ сделать это. Кто-нибудь знает?
В настоящее время я просто использую следующий метод:
def is_backend_namespace?
params[:controller].index("admin/") == 0
end
Заранее спасибо
Арне
Вы можете использовать:
self.class.parent == Admin
Вне контроллера (например, в представлениях) используйте имя контроллера .class.name. Вы можете превратить это в вспомогательный метод следующим образом:
module ApplicationHelper
def admin?
controller.class.name.split("::").first=="Admin"
end
end
В контроллере и представлениях вы можете проанализировать путь_контроллера, например:
namespace = controller_path.split('/').first
Не намного более элегантный, но он использует класс вместо хэша params. Я не знаю о "подготовленном" способе сделать это без некоторого разбора.
self.class.to_s.split("::").first=="Admin"
Ни одно из этих решений не рассматривает константу с несколькими родительскими модулями. Например:
A::B::C
С Rails 3.2.x вы можете просто:
"A::B::C".deconstantize #=> "A::B"
В Rails 3.1.x вы можете:
constant_name = "A::B::C"
constant_name.gsub( "::#{constant_name.demodulize}", '' )
Это потому, что #demodulize - это противоположность #deconstantize:
"A::B::C".demodulize #=> "C"
Если вам действительно нужно сделать это вручную, попробуйте следующее:
constant_name = "A::B::C"
constant_name.split( '::' )[0,constant_name.split( '::' ).length-1]
Установка пространства имен в контроллере приложения:
path = self.controller_path.split('/')
@namespace = path.second ? path.first : nil