Могу ли я получить имя текущего контроллера в представлении?

205

Есть ли способ выяснить, что текущий контроллер из вида?

Для примера, почему я хотел бы знать это: если несколько контроллеров совместно используют один и тот же макет, у меня может быть часть в файле ERB макета, где я хочу выделить элемент меню текущей страницы на основе контроллера.

Может быть, это плохой подход. Если да, то какой способ сделать это предпочтительнее?

Тем не менее, мне интересно узнать, как получить имя текущего контроллера.

(Очевидно, я мог бы добавить что-то подобное @controller_name = 'users'в каждый контроллер; но это похоже на то, что Rails уже сделал бы за кулисами. Поэтому мне просто интересно, есть ли встроенный способ.)

Дэн Тао
источник

Ответы:

247

controller_name содержит имя контроллера, используемого для обслуживания текущего представления.

Anubhaw
источник
94
На самом деле это плохая практика для использования paramsв виду. Пожалуйста, используйте controller_nameвместо этого
coorasse
1
@coorasse прав, конечно, информация есть, но лучше полагаться на имя_контроллера
Cec
261

В Rails Guides говорится:

Хэш params всегда будет содержать ключи: controller и: action, но для доступа к этим значениям следует использовать методы controller_name и action_name.

Параметры ActionController

Допустим, у вас есть класс CSS active, который должен быть вставлен в любую ссылку, чья страница в данный момент открыта (возможно, чтобы вы могли по-разному стилизовать). Если у вас есть static_pagesконтроллер с aboutдействием, вы можете выделить ссылку, как показано ниже:

<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
источник
21
Если у вас есть контроллер за пространством имен, как это: Admin::Ordersтогда controller_nameи params[:controller]будет "orders"и "admin/orders"соответственно.
Виктор Фоник
8
Я просто попытался использовать это и на Admin::UsersControllerсамом деле имеет controller_nameо usersи controller_pathо admin/usersв Rails 4.1.0.
Брэндон
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) %>

ссылка

Тха кп
источник
1
Чтобы получить идентификатор, ActionController :: Routing :: Routes больше не работает. Вы можете сделать это: <% = request.path_parameters [: id]%>
rmcsharry
2

controller_pathсодержит путь к контроллеру, используемому для обслуживания текущего представления. (т.е.:) admin/settings.

и

controller_nameсодержит имя контроллера, используемого для обслуживания текущего представления. (т.е.:) settings.

Рики Нотаро-Гарсия
источник
0

Если вы хотите использовать все таблицы стилей в своем приложении, просто добавьте эту строку в application.html.erb. Вставьте его внутри <head> тега

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

Также, чтобы указать тот же класс CSS на другом контроллере,
добавьте эту строку в bodyфайл application.html.erb.

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

Итак, теперь, например, я хотел бы изменить pтег в контроллере «home» и действии «index». Внутри index.scssфайл добавляет.

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
Сами
источник