Kann ich den Namen des aktuellen Controllers in der Ansicht abrufen?

205

Gibt es eine Möglichkeit, aus der Ansicht heraus herauszufinden, was der aktuelle Controller ist?

Ein Beispiel dafür, warum ich das wissen möchte: Wenn mehrere Controller dasselbe Layout verwenden, habe ich möglicherweise einen Teil in der Layout-ERB-Datei, in dem ich den Menüpunkt der aktuellen Seite basierend auf dem Controller hervorheben möchte.

Vielleicht ist das ein schlechter Ansatz. Wenn ja, was ist der bevorzugte Weg, dies zu tun?

Ich bin jedoch daran interessiert, den Namen des aktuellen Controllers so oder so zu erfahren.

(Natürlich könnte ich so etwas @controller_name = 'users'in jeden Controller einbauen; aber das scheint so, als hätte Rails dies bereits hinter den Kulissen getan. Ich frage mich nur, ob es einen eingebauten Weg gibt.)

Dan Tao
quelle

Antworten:

246

controller_name Enthält den Namen des Controllers, der für die aktuelle Ansicht verwendet wird.

Anubhaw
quelle
94
Eigentlich ist schlechte Praxis paramsin Sicht zu verwenden. Bitte verwenden Sie controller_namestattdessen
Coorasse
1
@coorasse ist richtig, sicher sind die Informationen da, aber es ist besser, sich auf controller_name zu verlassen
Cec
261

In den Rails Guides heißt es:

Der Parameter-Hash enthält immer die Tasten: controller und: action. Sie sollten jedoch stattdessen die Methoden controller_name und action_name verwenden, um auf diese Werte zuzugreifen

ActionController-Parameter

Angenommen, Sie haben eine CSS-Klasse active, die in einen beliebigen Link eingefügt werden sollte, dessen Seite derzeit geöffnet ist (möglicherweise, damit Sie einen anderen Stil verwenden können). Wenn Sie einen static_pagesController mit einer aboutAktion haben, können Sie den Link in Ihrer Ansicht wie folgt markieren:

<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
quelle
21
Wenn Sie Ihren Controller hinter einem Namensraum wie folgt aussehen: Admin::Ordersdann controller_nameund params[:controller]wird "orders"und "admin/orders"jeweils.
Viktor Fonic
8
Ich habe gerade versucht, dies zu verwenden und habe Admin::UsersControllertatsächlich ein controller_namevon usersund ein controller_pathvon admin/usersin Rails 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) %>

Referenz

Thaha kp
quelle
1
Um die ID abzurufen, funktioniert ActionController :: Routing :: Routes nicht mehr. Sie können dies tun: <% = request.path_parameters [: id]%>
rmcsharry
2

controller_pathEnthält den Pfad des Controllers, der für die aktuelle Ansicht verwendet wird. (dh :) admin/settings.

und

controller_nameEnthält den Namen des Controllers, der für die aktuelle Ansicht verwendet wird. (dh :) settings.

Ricky Notaro-Garcia
quelle
0

Wenn Sie alle Stylesheets in Ihrer App verwenden möchten, fügen Sie diese Zeile einfach in application.html.erb hinzu. Fügen Sie es in das <head> Tag ein

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

Um dieselbe Klasse CSS auf einem anderen Controller anzugeben,
fügen Sie diese Zeile in die bodyDatei application.html.erb ein

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

So möchte ich jetzt zum Beispiel das pTag in 'Home'-Controller und' Index'-Aktion ändern . Innerhalb der index.scssDatei hinzugefügt.

.nameOfController-nameOfAction <tag> { }

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