뷰에서 현재 컨트롤러의 이름을 얻을 수 있습니까?


205

뷰 내에서 현재 컨트롤러가 무엇인지 알아내는 방법이 있습니까?

내가 이것을 알고 싶은 이유의 예 : 여러 컨트롤러가 동일한 레이아웃을 공유하는 경우 레이아웃 ERB 파일에 컨트롤러를 기반으로 현재 페이지의 메뉴 항목을 강조 표시하려는 부분이있을 수 있습니다.

어쩌면 그것은 나쁜 접근법입니다. 그렇다면 더 선호하는 방법은 무엇입니까?

그래도 현재 컨트롤러의 이름을 얻는 방법에 대해 알고 싶습니다.

(분명히 @controller_name = 'users'각 컨트롤러 에 무언가를 넣을 수는 있지만 Rails가 이미 배후에서 한 일처럼 보입니다. 따라서 내장 방법이 있는지 궁금합니다.)

답변:


246

controller_name 현재보기를 제공하는 데 사용되는 컨트롤러 이름을 보유합니다.


94
실제로 params보기 에 사용하는 것은 나쁜 습관 입니다. controller_name대신 사용하십시오
coorasse

1
@coorasse는 정보가 확실하지만 controller_name에 의존하는 것이 좋습니다
Cec

261

Rails Guides에서 다음과 같이 말합니다.

params 해시는 항상 : controller 및 : action 키를 포함하지만 이러한 값에 액세스하려면 controller_nameaction_name 메소드를 대신 사용해야 합니다.

ActionController 매개 변수

CSS 클래스가 있다고 가정 해 봅시다. 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"and는 "admin/orders"각각 있습니다.
Viktor Fonic

8
난 그냥이를 사용하려하고 Admin::UsersController실제로이 controller_nameuserscontroller_path의를 admin/users레일 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) %>

참고


1
ID를 얻으려면 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를 지정하려면 application.html.erb
에이 줄을 추가하십시오.body

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

이제 예를 들어 p'home'컨트롤러 및 'index'작업에서 태그 를 변경하고 싶습니다 . 내부 index.scss파일이 추가됩니다.

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.