ビュー内の現在のコントローラーの名前を取得できますか?


205

現在のコントローラーがビュー内から何であるかを理解する方法はありますか?

これを知りたい理由の例:複数のコントローラーが同じレイアウトを共有している場合、コントローラーに基づいて現在のページのメニュー項目を強調表示したいレイアウトERBファイルにパーツがある可能性があります。

多分それは悪いアプローチです。もしそうなら、これを行うためのより好ましい方法は何ですか?

ただし、現在のコントローラーの名前をいずれかの方法で取得する方法について知りたいです。

(もちろん@controller_name = 'users'、各コントローラーに何かを入れることもできますが、Railsがすでに裏で行っているようなことなので、組み込みの方法があるかどうか疑問に思っています。)

回答:


246

controller_name 現在のビューを提供するために使用されるコントローラーの名前を保持します。


94
実際に使用するのは悪い習慣paramsです。controller_name代わりに使用してください
coorasse

1
@coorasseは正しい、確かに情報はあるが、controller_nameに依存する方が良い
Cec

261

Railsガイドで、それは言う:

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"ます。
Viktor Fonic 2013

8
私はこれを使用しようとAdmin::UsersController、実際に持っているcontroller_nameuserscontroller_pathのをadmin/usersRailsの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
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を指定する
にはbody、application.html.erbの次の行を追加します。

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

したがって、たとえばp、「ホーム」コントローラーと「インデックス」アクションのタグを変更したいと思います。内部index.scssファイルが追加されます。

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.