Posso ottenere il nome dell'attuale controller nella vista?


205

C'è un modo per capire quale sia l'attuale controller all'interno della vista?

Per un esempio del motivo per cui vorrei saperlo: se più controller condividono lo stesso layout, potrei avere una parte nel file ERB del layout in cui desidero evidenziare la voce di menu della pagina corrente in base al controller.

Forse è un cattivo approccio. In tal caso, qual è il modo più preferito per farlo?

Sono interessato a sapere come ottenere il nome del controller corrente in entrambi i modi, però.

(Ovviamente potrei mettere qualcosa di simile @controller_name = 'users'in ogni controller; ma sembra che il genere di cose che Rails avrebbe già fatto dietro le quinte. Quindi mi chiedo solo se c'è un modo integrato.)

Risposte:


246

controller_name contiene il nome del controller utilizzato per servire la vista corrente.


94
In realtà è una cattiva pratica da usare paramsin vista. Si prega di utilizzare controller_nameinvece
coorasse

1
@coorasse ha ragione, sicuramente l'informazione è lì, ma fare affidamento su controller_name è meglio
Cec

261

Nelle Guide di Rails dice:

L'hash dei parametri conterrà sempre i tasti: controller e: action, ma per accedere a questi valori dovresti usare i metodi controller_name e action_name

Parametri ActionController

Quindi supponiamo che tu abbia una classe CSS active, che dovrebbe essere inserita in qualsiasi link la cui pagina è attualmente aperta (forse in modo che tu possa avere uno stile diverso). Se hai un static_pagescontroller con aboutun'azione, puoi quindi evidenziare il link in questo modo nella tua vista:

<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>

21
Se hai il tuo controller dietro uno spazio dei nomi come questo: Admin::Ordersallora controller_namee params[:controller]sarà "orders"e "admin/orders"rispettivamente.
Viktor Fonic,

8
Ho solo cercato di usare questo e Admin::UsersControllerin realtà ha un controller_namedi userse controller_pathdi 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) %>

riferimento


1
Per ottenere l'id, ActionController :: Routing :: Route non funziona più. Puoi farlo: <% = request.path_parameters [: id]%>
rmcsharry

2

controller_pathcontiene il percorso del controller utilizzato per servire la vista corrente. (cioè:) admin/settings.

e

controller_namecontiene il nome del controller utilizzato per servire la vista corrente. (cioè:) settings.


0

Se vuoi usare tutti i fogli di stile nella tua app, aggiungi questa riga in application.html.erb. Inseriscilo nel <head> tag

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

Inoltre, per specificare la stessa classe CSS su un controller diverso,
aggiungere questa riga in bodyof application.html.erb

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

Quindi, ad esempio, ora vorrei modificare il ptag nel controller "home" e nell'azione "index". index.scssFile interno aggiunge.

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.