16

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

我想使用 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

4

3 回答 3

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" ) ) )%>"
};
于 2011-07-27T04:34:14.193 回答
10

像这样调用它ActionController::Base.helpers

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

请注意,这j是 的别名escape_javascript,因此您可以根据需要使用长名称。

于 2015-03-19T19:00:51.927 回答
8

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

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

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

<% environment.context_class.instance_eval { include MyHelper } %>
于 2011-11-15T09:14:36.893 回答