Puis-je obtenir le nom du contrôleur actuel dans la vue?

205

Existe-t-il un moyen de déterminer ce qu'est le contrôleur actuel dans la vue?

Pour un exemple de pourquoi je voudrais savoir ceci: si plusieurs contrôleurs partagent la même disposition, je peux avoir une partie dans le fichier ERB de disposition où je veux mettre en évidence l'élément de menu de la page actuelle basé sur le contrôleur.

C'est peut-être une mauvaise approche. Dans l'affirmative, quelle est la façon la plus préférée de procéder?

Cependant, je suis curieux de savoir comment obtenir le nom du contrôleur actuel.

(Évidemment, je pourrais mettre quelque chose comme @controller_name = 'users'dans chaque contrôleur; mais cela semble être le genre de chose que Rails aurait déjà fait dans les coulisses. Je me demande donc s'il y a un moyen intégré.)

Dan Tao
la source

Réponses:

247

controller_name contient le nom du contrôleur utilisé pour servir la vue actuelle.

Anubhaw
la source
94
En fait, c'est une mauvaise pratique à utiliser paramsen vue. Veuillez utiliser à la controller_nameplace
coorasse
1
@coorasse a raison, c'est sûr que les informations sont là, mais s'appuyer sur controller_name est mieux
Cec
261

Dans les guides Rails, il est écrit:

Le hachage params contiendra toujours les touches: controller et: action, mais vous devez utiliser les méthodes controller_name et action_name à la place pour accéder à ces valeurs

Paramètres ActionController

Supposons donc que vous ayez une classe CSS active, qui devrait être insérée dans n'importe quel lien dont la page est actuellement ouverte (peut-être pour que vous puissiez styliser différemment). Si vous avez un static_pagescontrôleur avec une aboutaction, vous pouvez alors mettre en surbrillance le lien ainsi dans votre vue:

<li>
  <a class='button <% if controller.controller_name == "static_pages" && controller.action_name == "about" %>active<%end%>' href="https://stackoverflow.com/about">
      About Us
  </a>
</li>
Musili
la source
21
Si vous avez votre contrôleur derrière un espace de noms comme celui-ci: Admin::Ordersalors controller_nameet params[:controller]sera "orders"et "admin/orders"respectivement.
Viktor Fonic
8
Je viens d' essayer d'utiliser cela et Admin::UsersControllera fait un controller_namede userset controller_pathde admin/usersRails 4.1.0.
Brandon
89
#to get controller name:
<%= controller.controller_name %>
#=> 'users'

#to get action name, it is the method:
<%= controller.action_name %>
#=> 'show'


#to get id information:
<%= ActionController::Routing::Routes.recognize_path(request.url)[:id] %>
#=> '23'

# or display nicely
<%= debug Rails.application.routes.recognize_path(request.url) %>

référence

Thaha kp
la source
1
Pour obtenir l'id, ActionController :: Routing :: Routes ne fonctionne plus. Vous pouvez le faire: <% = request.path_parameters [: id]%>
rmcsharry
2

controller_pathcontient le chemin du contrôleur utilisé pour servir la vue actuelle. (ie:) admin/settings.

et

controller_namecontient le nom du contrôleur utilisé pour servir la vue actuelle. (ie:) settings.

Ricky Notaro-Garcia
la source
0

Si vous souhaitez utiliser toutes les feuilles de style dans votre application, ajoutez simplement cette ligne dans application.html.erb. Insérez-le dans la <head> balise

  <%= stylesheet_link_tag  controller.controller_name , media: 'all', 'data-turbolinks-track': 'reload' %>

Aussi, pour spécifier la même classe CSS sur un autre contrôleur
Ajoutez cette ligne dans le bodyfichier application.html.erb

  <body class="<%= controller.controller_name %>-<%= controller.action_name %>">

Donc, maintenant, par exemple, je voudrais changer la pbalise dans le contrôleur «home» et l'action «index». Le index.scssfichier intérieur s'ajoute.

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
Sami
la source