Czy mogę wyświetlić nazwę bieżącego kontrolera w widoku?

205

Czy istnieje sposób, aby dowiedzieć się, jaki jest aktualny kontroler z widoku?

Na przykład, dlaczego chciałbym to wiedzieć: jeśli kilka kontrolerów współdzieli ten sam układ, mogę mieć część w pliku ERB układu, w której chcę podświetlić pozycję menu bieżącej strony na podstawie kontrolera.

Może to złe podejście. Jeśli tak, jaki jest najbardziej preferowany sposób?

Chciałbym jednak wiedzieć o tym, jak uzyskać nazwę bieżącego kontrolera.

(Oczywiście, mógłbym umieścić coś takiego @controller_name = 'users'w każdym kontrolerze; ale wydaje się, że to coś, co Rails zrobiłby już za kulisami. Zastanawiam się tylko, czy istnieje jakiś wbudowany sposób.)

Dan Tao
źródło

Odpowiedzi:

246

controller_name zawiera nazwę kontrolera używanego do obsługi bieżącego widoku.

Anubhaw
źródło
94
W rzeczywistości jest to zła praktyka w użyciu params. controller_nameZamiast tego użyj
coorasse
1
@coorasse ma rację, na pewno informacje tam są, ale lepiej jest polegać na
nazwie nazwa_kontrolera
261

W przewodnikach po Railsach napisano:

Hash params będzie zawsze zawierać: klucze działania, ale należy użyć metody: kontroler i controller_name i ACTION_NAME zamiast dostęp do tych wartości

Parametry ActionController

Powiedzmy, że masz klasę CSS active, którą należy wstawić do dowolnego linku, którego strona jest obecnie otwarta (być może, abyś mógł stylizować inaczej). Jeśli masz static_pageskontroler z aboutdziałaniem, możesz podświetlić link w taki sposób:

<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
źródło
21
Jeśli masz kontroler za pomocą nazw tak: Admin::Orderswtedy controller_namei params[:controller]będzie "orders"i "admin/orders"odpowiednio.
Viktor Fonic
8
Po prostu starał się to wykorzystać i Admin::UsersControllerfaktycznie ma controller_namez usersa controller_pathz admin/usersw 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) %>

odniesienie

Thaha kp
źródło
1
Aby uzyskać identyfikator, ActionController :: Routing :: Routes już nie działa. Możesz to zrobić: <% = request.path_parameters [: id]%>
rmcsharry 7.04.16
2

controller_pathprzechowuje ścieżkę kontrolera używaną do obsługi bieżącego widoku. (tj .:) admin/settings.

i

controller_namezawiera nazwę kontrolera używanego do obsługi bieżącego widoku. (tj .:) settings.

Ricky Notaro-Garcia
źródło
0

Jeśli chcesz używać wszystkich arkuszy stylów w swojej aplikacji, po prostu dodaj ten wiersz w application.html.erb. Wstaw go do <head> tagu

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

Ponadto, aby określić tę samą klasę CSS na innym kontrolerze
Dodaj ten wiersz do pliku bodyapplication.html.erb

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

Na przykład teraz chciałbym zmienić ptag w kontrolerze „home” i akcji „index”. index.scssDodano plik wewnętrzny .

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
Sami
źródło