在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
资产