Rails:获取当前请求的控制器和操作

20
在我的Rails应用程序中,我在views/layouts/application.html.erb中使用<html id=<%= params[:controller] + "_" + params[:action] %>。奇怪的是,如果这些值出现在开头的<body>标签之上,params[:controller]params[:action]的值总是比请求滞后1个。因此,如果我在users/1页面,但是我从users/来的,那么在<body>标签之上的值将为controller: "users"和action: "index",而不是 params[:action]不应该是"show"吗?如果我刷新页面,它会“追赶上来”,并正确地显示controller: "users"和action: "show"。为什么会发生这种情况?我如何获得当前请求的控制器和操作?这些参数是否只有在第一次调用yield时才会更新?

那么 <html id="<%= "#{params[:controller]}_#{params[:action]}" %>"> 怎么样? - Vucko
调试渲染此布局的控制器并查看实际值。 - sevenseacat
调试显示在打开body标签后正确的值,但在打开body标签之前有延迟的值。 - Don P
1
你正在使用Turbolinks吗? - Mike Campbell
是的。这已经是Turbolinks第二次引起这种疯狂的错误了。Turbolinks带来的性能提升真的值得吗?它似乎让做简单的事情,比如这个例子,变得困难。 - Don P
2个回答

47

对于控制器,您可以访问本地实例controller。 如果您想要完整的名称,您需要使用类似于controller.class.name.split("::").first的内容,这将在您的示例中给出UsersController。 如果您只想返回users,则可以使用controller.controller_name

对于操作,您可以使用controller.action_name

更新:

请在您的视图中尝试这些内容,并查看它们是否也存在延迟:

<p><%= controller_name %></p>
<p><%= action_name %></p>

我怀疑他们都委托给我在之前回答中提到的控制器,但值得一试。


它们也会滞后。我刚注意到只有当我将它放在application.html.erb的<% yield %>返回的内容中时,它们才不会滞后。 - Don P
这可能与“yield”块有关吗?也许实例变量直到yield开始后才更新?这可能解释了为什么<html id=<%= controller_name %>的值可以与“some_var”不同。 - Don P
1
在Rails 4.2中,我只使用了action_name,而controller.action_name无效。 - elsurudo

2

3
该死的TurboLinks。随着现代浏览器和连接速度的提高,我真的在想它们是否值得麻烦。 - Jon
1
又被 Turbolinks 绊倒了!你也可以为特定的链接关闭 Turbolinks:link_to '注销', logout_users_path, method: :delete, "data-no-turbolink" => true - Chloe

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