如何在我的sprockets预处理的js文件(不是视图)中获取escape_javascript和其他帮助器?

时间:2011-07-27 01:38:15

标签: javascript ruby-on-rails ruby-on-rails-3.1 erb sprockets

我正在使用Rails 3.1和链轮的东西。

我想使用ERB预处理js文件,然后使用javascript_include_tag将其包含在内。它是从代码生成的,所以我用ERB预处理它,但是我无法从ActionView :: Helpers :: JavaScriptHelper

中找到像escape_javascript这样的帮助器

假设我的文件名为dynamic.js.erb,它包含

obj = {
 name: "test",
 tag: "<%= escape_javascript( image_tag( "logo.png" ) )%>"
};

如何阻止它产生错误:

throw Error("NoMethodError: undefined method `escape_javascript' for #<#<Class:0x1067da940>:0x116b2be18>
(in /Users/me/site/app/assets/javascripts/dynamic.js.erb)")

当我点击本地服务器并要求/assets/dynamic.js

3 个答案:

答案 0 :(得分:13)

您可以将rails JS助手包含在您自己的类中。

class Helper
  include ActionView::Helpers::JavaScriptHelper

  def self.escape_js( text )
    @instance ||= self.new
    return @instance.escape_javascript( text )
  end
end

然后在您的ERB文件中使用它:

obj = {
 name: "test",
 tag: "<%= Helper.escape_js( image_tag( "logo.png" ) ) )%>"
};

答案 1 :(得分:10)

通过ActionController::Base.helpers这样称呼它:

// file.js.erb
var x = "<%= ActionController::Base.helpers.j image_tag('logo.png') %>";

请注意,jescape_javascript的别名,因此如果您愿意,可以使用长名称。

答案 2 :(得分:8)

您也可以将JavaScriptHelper直接包含在Sprockets Context类(运行模板的类)中:

<% environment.context_class.instance_eval { include ActionView::Helpers::JavaScriptHelper } %>

甚至可以在其他地方定义您的帮助程序并将其包含在模板中(以便能够并重用帮助程序)

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