【问题标题】:Rails: Get the controller and action of the current requestRails:获取当前请求的控制器和动作
【发布时间】:2014-01-28 07:46:05
【问题描述】:

在我的 Rails 应用程序中,我在views/layouts/application.html.erb 中使用<html id=<%= params[:controller] + "_" + params[:action] %>

奇怪的是,params[:controller]params[:action] 的值总是滞后 1 个请求如果它高于打开的 <body> 标记。

所以如果我在users/1,但我来自users/,则上面打开<body> 的值将是控制器:“用户”和操作:“索引”。 params[:action] 不应该是“秀”吗?

然后,如果我刷新页面,它会“赶上”并正确拥有控制器:“用户”和操作:“显示”。

为什么会这样?如何获取当前请求控制器和操作?这些参数在第一次调用yield 之前不会更新吗?

【问题讨论】:

  • <html id="<%= "#{params[:controller]}_#{params[:action]}" %>"> 怎么样?
  • 调试渲染此布局的控制器并查看实际值。
  • 已编辑问题 - 调试在打开正文标记后显示正确的值,但在打开正文标记之前显示滞后值。
  • 你在使用 turbolinks 吗?
  • ....是的。这是 turbolinks 第二次引起这些疯狂的错误之一。 turbolinks 带来的性能提升真的值得吗?它似乎让做简单的事情变得困难,例如这个。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

对于控制器,您可以访问本地实例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 的 中返回的内容中,它们不会滞后。
  • 这可能与“产量”块有关吗?也许实例变量直到产量开始后才更新?这或许可以解释为什么 &lt;html id=&lt;%= controller_name %&gt; 可以具有与“some_var”不同的值。
  • 在 Rails 4.2 中仅供参考,我刚刚使用了 action_name... controller.action_name 没有用
【解决方案2】:

这是涡轮链接。关闭 turbolinks,你就可以开始了。 http://blog.steveklabnik.com/posts/2013-06-25-removing-turbolinks-from-rails-4

【讨论】:

  • 血腥的涡轮链接。有了现代浏览器和连接速度,我真的想知道它们是否值得麻烦。
  • 再次被 Turbolinks 挫败!您也可以关闭特定链接的 Turbolinks:link_to 'Logout', logout_users_path, method: :delete, "data-no-turbolink" =&gt; true
猜你喜欢
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多