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

noc*_*che 15 javascript ruby-on-rails erb ruby-on-rails-3.1 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" ) )%>"
};
Run Code Online (Sandbox Code Playgroud)

如何阻止它产生错误:

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

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

cam*_*mmm 13

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

class Helper
  include ActionView::Helpers::JavaScriptHelper

  def self.escape_js( text )
    @instance ||= self.new
    return @instance.escape_javascript( text )
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在ERB文件中使用它:

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


bal*_*and 10

ActionController::Base.helpers像这样称呼它:

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

请注意,这j是别名escape_javascript,因此如果您愿意,可以使用长名称.


eir*_*irc 8

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

<% environment.context_class.instance_eval { include ActionView::Helpers::JavaScriptHelper } %>
Run Code Online (Sandbox Code Playgroud)

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

<% environment.context_class.instance_eval { include MyHelper } %>
Run Code Online (Sandbox Code Playgroud)