我可以在视图中获取当前控制器的名称吗?


205

有没有办法从视图中找出当前控制器是什么?

例如,为什么我想知道这一点:如果多个控制器共享同一布局,则我可能会在布局ERB文件中有一个部分,我想根据该控制器突出显示当前页面的菜单项。

也许这是一个不好的方法。如果是这样,更优选的方法是什么?

我很想知道有关以哪种方式获取当前控制器名称的信息。

(显然,我可以@controller_name = 'users'在每个控制器中添加类似的内容;但这似乎是Rails在幕后已经做过的事情。所以我只是想知道是否有内置的方法。)

Answers:


246

controller_name 包含用于提供当前视图的控制器的名称。


94
params鉴于此,实际上是不好的做法。请controller_name改用
coorasse 2014年

1
@coorasse是正确的,可以肯定地知道这里的信息,但是更好地依靠controller_name
Cec 2016年

261

在Rails指南中,它说:

params哈希将始终包含:controller和:action键,但应使用controller_nameaction_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::Orderscontroller_nameparams[:controller]将分别为"orders""admin/orders"
维克多·佛尼克

8
我只是尝试使用它,在Rails 4.1.0中Admin::UsersController实际上有一个controller_nameof userscontroller_pathof admin/users
布兰登

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 '16

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在“ home”控制器和“ index”操作中更改标签。内部index.scss文件添加。

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.