Подтвердить что ты не робот

Rails 3: получить текущее пространство имен?

с помощью метода: layout_for_namespace Я установил свой макет приложения в зависимости от того, есть ли я в интерфейсе или бэкэнд, поскольку бэкэнд использует пространство имен "admin".

Я не мог найти красивый способ узнать, какое пространство имен я есть, единственный способ, которым я нашел, - это разбор строки из params [: controller]. Конечно, это легко, кажется, отказоустойчиво и работает хорошо. Но мне просто интересно, есть ли лучший, подготовленный, способ сделать это. Кто-нибудь знает?

В настоящее время я просто использую следующий метод:

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

Заранее спасибо

Арне

4b9b3361

Ответ 1

Вы можете использовать:

self.class.parent == Admin

Ответ 2

Вне контроллера (например, в представлениях) используйте имя контроллера .class.name. Вы можете превратить это в вспомогательный метод следующим образом:

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

Ответ 3

В контроллере и представлениях вы можете проанализировать путь_контроллера, например:

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

Ответ 4

Не намного более элегантный, но он использует класс вместо хэша params. Я не знаю о "подготовленном" способе сделать это без некоторого разбора.

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

Ответ 5

Ни одно из этих решений не рассматривает константу с несколькими родительскими модулями. Например:

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]

Ответ 6

Установка пространства имен в контроллере приложения:

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