我能否在视图中获取当前控制器的名称?

233
有没有一种方法可以在视图中确定当前控制器?
举个例子,为什么要知道这个:如果几个控制器共享相同的布局,我可能有一个在布局ERB文件中的部分,我想根据控制器突出显示当前页面的菜单项。
也许这是一种不好的方法。 如果是这样,请问有更优选的方法吗?
无论如何,我都很想知道获取当前控制器名称的方法。
(显然,我可以在每个控制器中放置类似@controller_name ='users'这样的东西; 但那似乎是Rails已经在幕后完成的事情。 所以我只是想知道是否有内置的方法。)
5个回答

288

controller_name保存了用于提供当前视图的控制器名称。


96
在视图中使用params实际上是不好的做法。 请改用controller_name - coorasse
1
@coorasse是正确的,信息肯定在那里,但依靠控制器名称更好。 - Cec

277

使用controller.controller_name

在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="/about">
      About Us
  </a>
</li>

25
如果您将控制器放在命名空间中,例如 Admin::Orders,那么 controller_nameparams[:controller] 将分别为 "orders""admin/orders" - Viktor
9
我刚试着使用这个功能,实际上在Rails 4.1.0中,Admin::UsersControllercontroller_nameusers,而 controller_pathadmin/users - Brandon

94
#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

7

controller_path保存了用于提供当前视图的控制器路径。(例如:admin/settings)。

以及

controller_name保存了用于提供当前视图的控制器名称。(例如:settings)。


1
如果您想在应用程序中使用所有样式表,只需在application.html.erb中添加此行即可。将其插入<head>标签内。
  <%= stylesheet_link_tag  controller.controller_name , media: 'all', 'data-turbolinks-track': 'reload' %>

此外,为了在不同的控制器上指定相同的CSS类,请在application.html.erb的中添加以下行:
  <body class="<%= controller.controller_name %>-<%= controller.action_name %>">

所以,比如说我想要在“home”控制器和“index”操作中更改p标签。 在index.scss文件中添加。
.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接