2010-11-19 23 views
25

en utilisant une méthode: layout_for_namespace Je définis la mise en page de mon application selon que je suis en frontend ou en backend, car le backend utilise un espace de noms "admin".Rails 3: Obtenir l'espace de noms actuel?

Je n'ai pas trouvé de moyen de trouver quel espace de noms je suis, la seule façon que j'ai trouvée est d'analyser la chaîne à partir de params [: controller]. Bien sûr que c'est facile, semble être sûr et fonctionne bien. Mais je me demande simplement s'il existe une meilleure façon de le faire. Est-ce que quelqu'un sait?

Actuellement, je suis juste en utilisant la méthode suivante:

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

Merci à l'avance

Arne

Répondre

12

Pas beaucoup plus élégant, mais il utilise la classe au lieu du hachage params. Je ne suis pas au courant d'une façon "préparée" de le faire sans un peu d'analyse.

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

Salut. Ce n'est pas ce que je voulais dire, désolé. Le nom du contrôleur est quelque chose d'autre, "admin" est l'espace de noms. C'est Admin :: MyController, alors params [: controller] donne "admin/my_controller" ou quelque chose, c'est à dire que je vérifie s'il s'agit de l'espace de noms admin. En utilisant controller_name, je devrais faire exactement la même chose, mais j'aimerais connaître le moyen de ne pas l'utiliser, mais de ne récupérer que l'espace de noms. – arnekolja

+0

Ma faute, je n'ai pas lu la question de près. Vous indiquez clairement l'espace de noms et non le nom du contrôleur. Réponse mise à jour avec une alternative. – johnmcaliley

+2

Plus simplement 'controller.class.name.start_with? ('Admin')'. –

25

En dehors du contrôleur (par exemple dans les vues), utilisez controller.class.name. Vous pouvez transformer cela en une méthode d'aide comme ceci:

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

Merci. C'est une solution simple et facile à utiliser, en particulier lorsque vous devez vérifier l'espace de noms dans 'Views'. –

+2

également dans les vues, vous pouvez utiliser controller.class.parent.name – engineerDave

+0

comment appeler cela à partir de la vue? –

14

Dans le contrôleur et les vues, vous pouvez analyser controller_path, par exemple .:

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

cela donne '' foo'' retour si je dis '' foo'.split ('/'). First'. Une solution serait préférable si l'espace de noms est 'nil' lors de la vérification d'un nom de contrôleur sans nom de domaine – Cristian

6

Réglage de l'espace de noms dans le contrôleur d'application:

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

Cela éviterait le ternaire: @namespace = (path.first si path.second) – parndt

8

Aucune de ces solutions ne considère une constante avec plusieurs modules parents. Par exemple:

A::B::C 

Comme Rails 3.2.x vous pouvez simplement:

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

Comme Rails 3.1.x, vous pouvez:

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

C'est parce que #demodulize est le opposé de #deconstantize:

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

Si vous avez vraiment besoin de le faire manuellement, essayez ceci:

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

Cela devrait être la réponse acceptée. – GMA

33

Vous pouvez utiliser:

self.class.parent == Admin 
+1

cette réponse devrait être la première! –

+1

Je suis d'accord, cela devrait être la réponse acceptée. – mysmallidea

+6

Comme beaucoup l'ont souligné, cela ne fonctionne pas pour les classes qui ont plusieurs niveaux d'espace de noms. Cependant, si vous vérifiez simplement si vous êtes dans un tel espace de noms (comme le type d'OP en question), vous pouvez utiliser 'controller.class.parents.include? (Admin)' et obtenir la même chose sans avoir avoir recours à l'analyse de chaîne – trcarden