在JavaScript资源中使用Rails帮助器方法

有什么办法可以使用Rails帮助器方法,更具体地说,是一个JavaScript资源文件中的path帮助器方法。 这个文件foo.js.coffee.erb

 $('#bar').val("<%= create_post_path %>") 

如果我能从erubis得到,我会喜欢它

 $('#bar').val("path/to/create") 

你可以在erb模板中包含任何helper / module / class:

 <% environment.context_class.instance_eval { include MyHelper } %> 

请参阅: https : //github.com/rails/sprockets/blob/master/lib/sprockets/environment.rb和https://github.com/rails/sprockets/blob/master/lib/sprockets/context.rb

要使用url助手,你必须包含你的特定应用程序的助手。

它们在Rails.application.routes.url_helpers中可用,所以:

 <% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %> 

编辑:固定链接移动的链轮回购,但不能确定这是多less年后仍然有道理。

这也将在初始化程序中做到这一点:

 Sprockets::Context.send :include, MyHelper 

在开发模式下,帮助程序不会在每个请求中重新加载。

你的UrlHelpers的方法将工作,直到你需要findpost_path(...um...we don't know what post id we'll need at compile time...) 。 有一个ruby的gem,它重新实现了JavaScript中的所有Rails UrlHelpers: https : //github.com/railsware/js-routes

我不太清楚,为什么你想这样做。

  • 你会阻止JavaScript文件被caching,因为它包含一个dynamic的值

  • 你会得到你的JavaScript /咖啡脚本和轨道之间的耦合

如果可能的话,我会build议你通过在视图中提供你的目标path来抽象你的问题,并在发生特定事件时从DOM元素中检索值。 就像Rails的“Unobtrusive Scripting Adapters”一样。 例如: https : //github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

事实上,我同意@eirc答案(考虑到链轮文档)。 但是我会考虑在引导时引入helper模块。 按照

 # config/initializers/sprockets.rb Rails.application.assets.context_class.instance_eval do include ActionView::Helpers include Rails.application.routes.url_helpers include MyModule end 

这是因为: https : //github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L23

实际上,不确定这是否有帮助,但有一种方法可以在rake precompile期间定义自己的帮助rake precompile

创build一个新的初始化器,并把它放在它:

 module Sprockets module Helpers module RailsHelper def my_helper_method ... end end end end 

然后你可以:

 <%= my_helper_method %> 

在您的.erb资产