Rails 3: получить текущее пространство имен? - PullRequest
30 голосов
/ 19 ноября 2010

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

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

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

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

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

Arne

Ответы [ 6 ]

38 голосов
/ 22 февраля 2013

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

self.class.parent == Admin
27 голосов
/ 19 апреля 2011

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

module ApplicationHelper
  def admin?
    controller.class.name.split("::").first=="Admin"
  end
end
18 голосов
/ 25 января 2012

Как в контроллере, так и в представлениях, вы можете анализировать controller_path, например ::10000

namespace = controller_path.split('/').first
12 голосов
/ 19 ноября 2010

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

10 голосов
/ 03 января 2013

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

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]
7 голосов
/ 15 апреля 2012

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

path = self.controller_path.split('/')
@namespace = path.second ? path.first : nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...