资产管道中的路由助手

49

我正在使用Rails 3.1.0.rc4,尝试在JavaScript文件(此处为event.js.erb)中访问路由辅助程序,但似乎它们在那时没有加载。当请求合并的/assets/application.js文件时,我会得到以下错误:

throw Error("NameError: undefined local variable or method `events_path' for #<#<Class:0x00000001580010>:0x00000003191510>\n  (in /<...>/app/assets/javascripts/event.js.erb)")

有什么办法可以在那里访问路由助手吗?


我在Rails 3.1稳定版中遇到了相同的问题。有人有什么想法可以解决这个问题吗? - Marc W
2个回答

89

更新:现在有一个宝石可以为您完成这项工作:js-routes


问题在于Sprockets在Rails应用程序的上下文之外评估ERB,而您期望的大部分内容都不在那里。

您可以像这样向Sprockets上下文添加内容:

Rails.application.assets.context_class.class_eval do
  include Rails.application.routes.url_helpers
end

这些都很好,但要使需要ID的帮助程序正常工作有点棘手。 我将使用一种称为URI模板的技术:

var event_path = "<%= CGI.unescape event_path('{event_id}') %>";

该函数返回/events/{event_id},您可以使用类似{ event_id: 1 }的对象将其呈现为URL。请参考SugarJS的String#assign方法,了解实现此功能的示例。您也可以像我一样自行创建


2
@MildFuzz 这是你在创建项目时给它的名称。如果你不记得了,可以查看 config/application.rb 文件。 - Adam Lassek
8
有没有更好的方法?我使用这个::Rails.application.routes.url_helpers.new_user_session_path - firedev
@Nick 在这里,Rails.applicationMyRailsApp::Application 基本上是等效的。 - Adam Lassek
1
@Nick 老实说,我无法想象那会成为一个问题。 - Adam Lassek
这个答案应该更新,包括@Nick的修复。这实际上非常有帮助,可以避免提及你的应用程序的名称。假设你需要把代码移植到其他地方或提取到一个引擎中,尽可能避免使用自己应用程序的名称进行引用。 - Justin Force
显示剩余6条评论

1
你可以将文件移动到视图中,使其可以访问适当的上下文,然后从JS源标签中将其下载到客户端。如果你正在编写引擎,则引用MyRailsApp :: Application.routes.url_helpers可能不是最好的选择。

2
你可以使用[EngineName]::Engine.routes.url_helpers来完成。 - Jay

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