¿Puedo obtener el nombre del controlador actual en la vista?

205

¿Hay alguna forma de averiguar cuál es el controlador actual desde la vista?

Para ver un ejemplo de por qué me gustaría saber esto: si varios controladores comparten el mismo diseño, es posible que tenga una parte en el archivo ERB de diseño donde quiero resaltar el elemento del menú de la página actual en función del controlador.

Quizás sea un mal enfoque. Si es así, ¿cuál es la forma más preferida de hacer esto?

Sin embargo, estoy interesado en saber cómo obtener el nombre del controlador actual de cualquier manera.

(Obviamente, podría poner algo como @controller_name = 'users'en cada controlador; pero ese parece ser el tipo de cosas que Rails ya habría hecho detrás de escena. Así que me pregunto si hay una forma integrada).

Dan Tao
fuente

Respuestas:

246

controller_name contiene el nombre del controlador utilizado para servir la vista actual.

Anubhaw
fuente
94
En realidad es una mala práctica usar paramsa la vista. Por favor, use controller_nameen su lugar
coorasse
1
@coorasse tiene razón, seguro que la información está ahí, pero confiar en controller_name es mejor
Cec
261

En las Guías de Rails, dice:

El parámetro hash siempre contendrá las teclas: controller y: action, pero debe usar los métodos controller_name y action_name para acceder a estos valores.

Parámetros de ActionController

Entonces, supongamos que tiene una clase CSS active, que debe insertarse en cualquier enlace cuya página esté actualmente abierta (tal vez para que pueda diseñar de manera diferente). Si tiene un static_pagescontrolador con una aboutacción, puede resaltar el enlace de esta manera en su 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>
Musili
fuente
21
Si tiene su controlador detrás de un espacio de nombres como este: Admin::Ordersentonces controller_namey params[:controller]será "orders"y "admin/orders"respectivamente.
Viktor Fonic
8
Intenté usar esto y en Admin::UsersControllerrealidad tengo un controller_namede usersy un controller_pathde admin/usersen 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) %>

referencia

Thaha kp
fuente
1
Para obtener la identificación, ActionController :: Routing :: Routes ya no funciona. Puede hacer esto: <% = request.path_parameters [: id]%>
rmcsharry
2

controller_pathcontiene la ruta del controlador utilizado para servir la vista actual. (es decir:) admin/settings.

y

controller_namecontiene el nombre del controlador utilizado para servir la vista actual. (es decir:) settings.

Ricky Notaro-Garcia
fuente
0

Si desea utilizar todas las hojas de estilo en su aplicación, simplemente agregue esta línea en application.html.erb. Insertarlo dentro de la <head> etiqueta

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

Además, para especificar la misma clase CSS en un controlador diferente
Agregue esta línea en la bodyaplicación.html.erb

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

Entonces, ahora, por ejemplo, me gustaría cambiar la petiqueta en el controlador 'home' y la acción 'index'. El index.scssarchivo interior agrega.

.nameOfController-nameOfAction <tag> { }

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