Чи можу я отримати ім'я поточного контролера у поданому вигляді?


205

Чи є спосіб розібратися, що знаходиться за поточним контролером зсередини подання?

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

Можливо, це поганий підхід. Якщо так, то який найбільш бажаний спосіб зробити це?

Мені цікаво знати, як отримати ім'я поточного контролера будь-яким способом.

(Очевидно, я міг би поставити щось подібне @controller_name = 'users'до кожного контролера; але це здається подібним, що Rails вже робив би за кадром. Тож мені просто цікаво, чи є вбудований спосіб.)

Відповіді:


246

controller_name містить ім'я контролера, що використовується для обслуговування поточного подання.


94
Насправді це є поганою практикою використання paramsз огляду. Будь ласка, використовуйте controller_nameзамість цього
coorasse

1
@coorasse має рацію, напевно, інформація є, але краще покладатися на ім’я_контролера
Cec

261

У Посібниках по рейках написано:

PARAMS хеш завжди буде містити: ключі дій, але ви повинні використовувати методи: контролер і 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 :: Маршрутизація :: Маршрути більше не працюють. Ви можете зробити це: <% = 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 на іншому контролері,
додайте цей рядок у програмі bodyapplication.html.erb

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

Отже, зараз, наприклад, я хотів би змінити pтег на "домашній" контролер і "індекс" дії. Всередині index.scssдодається файл.

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.