2010-11-19 14 views
25

przy użyciu metody: layout_for_namespace Ustawiam układ mojej aplikacji w zależności od tego, czy znajduję się w interfejsie, czy backendie, ponieważ backend używa przestrzeni nazw "admin".Szyny 3: Uzyskaj bieżący obszar nazw?

Nie mogłem znaleźć ładnego sposobu, aby dowiedzieć się, który obszar nazw jestem, jedynym sposobem, jaki znalazłem, jest parsowanie łańcucha znaków z parametrów [: controller]. Oczywiście, że to proste, wydaje się być bezpieczne i działa dobrze. Ale zastanawiam się, czy istnieje lepszy, przygotowany sposób na zrobienie tego. Czy ktoś wie?

Obecnie jestem po prostu stosując następującą metodę:

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

góry dziękuję

Arne

Odpowiedz

12

Nie wiele bardziej eleganckie, ale używa klasy zamiast hash params. Nie jestem świadomy "przygotowany" sposób to zrobić bez niektórych parsowania.

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

cześć. Nie o to mi chodziło, przepraszam. Nazwa kontrolera to coś innego, "admin" to przestrzeń nazw. To jest Admin :: MyController, więc params [: kontroler] daje "admin/my_controller" lub coś takiego, to tam sprawdzam, czy jest to obszar nazw administratora. Używając control_name, musiałbym zrobić to samo, ale chciałbym poznać sposób, żeby _parse_ nie odzyskać tylko przestrzeni nazw. – arnekolja

+0

Moja wina, nie przeczytałem dokładnie tego pytania. Jasno określasz przestrzeń nazw, a nie nazwę kontrolera. Odpowiedź została zaktualizowana za pomocą alternatywy. – johnmcaliley

+2

Po prostu "controller.class.name.start_with? ('Admin')'. –

25

Poza kontrolerem (np. W widokach) użyj control.class.name. Można przekształcić metody pomocnika tak:

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

Dzięki. Jest to proste i łatwe w użyciu rozwiązanie, szczególnie gdy musisz sprawdzić przestrzeń nazw w 'Widokach'. –

+2

również w widokach można użyć controller.class.parent.name – engineerDave

+0

jak wywołać to z widoku? –

14

Zarówno kontroler i widoki, można analizować controller_path, np .:

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

, która daje '' foo'', jeśli powiem ''foo'.split ('/'). First'. Rozwiązanie byłoby najlepsze, gdyby przestrzeń nazw miała wartość 'nil' przy sprawdzaniu nazwy kontrolera nieprzypisanej nazwy – Cristian

6

Ustawianie nazw w kontrolerze aplikacji:

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

To zlikwidowałoby potrójny: @namespace = (path.first jeśli path.second) – parndt

8

Żadne z tych rozwiązań nie uwzględnia stałej z wieloma modułami nadrzędnymi. Na przykład:

A::B::C 

Jak szyn 3.2.x można po prostu:

"A::B::C".deconstantize #=> "A::B" 

Jak szyn 3.1.x można:

constant_name = "A::B::C" 
constant_name.gsub("::#{constant_name.demodulize}", '') 

To dlatego #demodulize jest na odwrót od #deconstantize:

"A::B::C".demodulize #=> "C" 

Jeśli naprawdę trzeba to zrobić ręcznie, spróbuj tego:

constant_name = "A::B::C" 
constant_name.split('::')[0,constant_name.split('::').length-1] 
+1

To powinna być zaakceptowana odpowiedź. – GMA

33

Można użyć:

self.class.parent == Admin 
+1

ta odpowiedź powinna być pierwsza! –

+1

Zgadzam się, to powinna być zaakceptowana odpowiedź. – mysmallidea

+6

Jak wielu wskazuje, nie działa to w przypadku klas, które mają wiele poziomów przestrzeni nazw. Jeśli jednak po prostu sprawdzasz, czy znajdujesz się w takiej przestrzeni nazw (jak to było w przypadku typu OP), możesz użyć 'controller.class.parents.include? (Admin)' i dostać się do czegoś podobnego bez uciec się do parsowania ciągów – trcarden