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


205

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

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

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

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

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

Ответы:


247

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


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>

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;
      }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.