Posso obter o nome do controlador atual na exibição?

205

Existe uma maneira de descobrir qual é o controlador atual na exibição?

Para um exemplo de por que eu gostaria de saber isso: se vários controladores compartilham o mesmo layout, talvez eu faça parte do arquivo ERB do layout, onde desejo destacar o item de menu da página atual com base no controlador.

Talvez essa seja uma abordagem ruim. Em caso afirmativo, qual é a maneira mais preferida de fazer isso?

Estou interessado em saber como obter o nome do controlador atual de qualquer maneira, no entanto.

(Obviamente, eu poderia colocar algo como @controller_name = 'users'em cada controlador; mas isso parece o tipo de coisa que o Rails já teria feito nos bastidores. Então, eu só estou me perguntando se há uma maneira embutida.)

Dan Tao
fonte

Respostas:

246

controller_name mantém o nome do controlador usado para servir a visualização atual.

Anubhaw
fonte
94
Na verdade, é uma má prática para usar paramsem vista. Por favor, use em controller_namevez disso
coorasse 2/14
1
@coorasse é certo, com certeza a informação está lá, mas contando com controller_name é melhor
Cec
261

Nos Guias do Rails, ele diz:

O hash params sempre conterá as chaves: controller e: action, mas você deve usar os métodos controller_name e action_name para acessar esses valores

Parâmetros do ActionController

Então, digamos que você tenha uma classe CSS active, que deve ser inserida em qualquer link cuja página esteja aberta no momento (talvez para que você possa estilizar de maneira diferente). Se você tem um static_pagescontrolador com uma aboutação, é possível destacar o link da seguinte maneira:

<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
fonte
21
Se você possui seu controlador atrás de um espaço para nome como este: Admin::Ordersthen controller_namee params[:controller]será "orders"e "admin/orders"respectivamente.
Viktor Fonic 23/09
8
Eu apenas tentei usar isso e Admin::UsersControllerrealmente tem um controller_namede userse um controller_pathde admin/usersno 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) %>

referência

Thaha kp
fonte
1
Para obter o ID, o ActionController :: Routing :: Routes não funciona mais. Você pode fazer isso: <% = request.path_parameters [: id]%>
rmcsharry
2

controller_pathmantém o caminho do controlador usado para servir a visualização atual. (ie:) admin/settings.

e

controller_namemantém o nome do controlador usado para servir a visualização atual. (ie:) settings.

Ricky Notaro-Garcia
fonte
0

Se você quiser usar toda a folha de estilo em seu aplicativo, adicione esta linha em application.html.erb. Inserir dentro da <head> tag

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

Além disso, para especificar a mesma classe CSS em um controlador diferente
Adicione esta linha no arquivo bodyapplication.html.erb

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

Então, agora, por exemplo, eu gostaria de alterar a ptag no controlador 'home' e na ação 'index'. index.scssArquivo interno adiciona.

.nameOfController-nameOfAction <tag> { }

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