Rails 路径助手在 js.coffee.erb 中不起作用

Posted

技术标签:

【中文标题】Rails 路径助手在 js.coffee.erb 中不起作用【英文标题】:Rails path-helpers doesn't work in js.coffee.erb 【发布时间】:2013-02-09 19:29:26 【问题描述】:

在我的 Rails 3.2 应用程序 (Ruby 1.9) 中,在 Coffeescript 中使用路径助手时出现以下错误。

undefined local variable or method `new_user_session_path'

在我的部分 _usermenu.html.haml 中可以正常工作:

= link_to t('user.login'), new_user_session_path

在我的 app/assets/javascripts/metamenu.js.coffee.erb 中抛出上述错误:

$.get("<%= new_user_session_path %>")

coffeescript erb 中不能使用 x_path 和 x_url 助手吗?

【问题讨论】:

【参考方案1】:

这是因为您不在资产内部的视图上下文中。向文件添加 erb 扩展名不会改变这一点,它只是允许您评估嵌入式 ruby​​。

如果这是一次性场景,最好的办法是简单地使用字符串本身。

$.get("/sign_in")

如果你真的想要,你可以创建一个输出脚本标签的部分,将你的辅助方法输出到 js 变量中并以这种方式访问​​它们。

# in your layout

<%= render 'url_helpers' %>

# in app/views/layouts/_url_helpers.html.erb

<script>
  window.new_user_session_path = "<%= new_user_session_path %>";
  # add more if necessary
</script>

# in your coffeescript

$.get(@new_user_session_path)

另外值得记住的是,这显然永远不会适用于您将模型实例传递给 url 帮助程序的成员路由,因为这对咖啡脚本绝对不可用。请记住,在生产中资产是预编译的,因此您不能使用任何动态的东西。为此,您只能真正依靠在控制器中设置操作来响应 JS 调用。

【讨论】:

非常感谢!这绝对有道理!我所缺少的只是一个很好的解释...... :-) 您能否在最后扩展您对预编译资产和使用任何动态的评论?我正在尝试(到目前为止是徒劳的)使用 AJAX 调用来更新正在我的主页上呈现的图像。当#home 被点击时,变量 player 被设置为一个 Player 对象,并且每个玩家都有一个对应的图像保存到 /assets 中,标题为玩家的名字。当 AJAX 调用更新 player 的值时,我想更新主屏幕上显示的图像以对应 @player 的新值。我可以使用 jQuery 插入带有图像标签的 HTML 吗?谢谢! 来自未来的另一个注意事项...您还可以在视图中添加一个数据元素,如data-path,然后在 js 文件中抓取它。【参考方案2】:

旧帖子,但仍可从 Google 访问。

在 rails 4(当然至少也有 3 个)中,您可以使用路由助手轻松插入您的 js 文件:

assets/javascript/my_file.js.coffee.erb

<% self.class.include Rails.application.routes.url_helpers %>
window.index_route = '<%= index_path %>'

【讨论】:

以上是关于Rails 路径助手在 js.coffee.erb 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 app/views 中渲染 new.js.coffee.erb?

如何让 rails 路由助手始终使用 to_param 生成路径,即使我只是传入 ActiveRecord ID?

如何在 Rails 中测试助手?

如何将 Rails 视图助手提取到 gem 中?

实现 Rails 视图助手

Rails:如何访问 RESTful 助手?