Как мне получить escape_javascript и другие помощники в моем предварительно обработанном sprockets файле js (не в представлении)? - PullRequest
15 голосов
/ 27 июля 2011

Я использую Rails 3.1 и вспомогательные файлы.

Я хочу использовать ERB для предварительной обработки файла js, который затем будет включен с использованием javascript_include_tag.Он сгенерирован из кода, и поэтому я предварительно обрабатываю его с помощью ERB, но я не могу добраться до таких помощников, как escape_javascript из ActionView :: Helpers :: JavaScriptHelper

Скажем, мой файл называется динамическим.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 ]

13 голосов
/ 27 июля 2011

Вы можете включить помощников 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" ) ) )%>"
};
10 голосов
/ 19 марта 2015

Позвоните через ActionController::Base.helpers как это:

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

Обратите внимание, что j является псевдонимом для escape_javascript, поэтому вы можете использовать длинное имя, если хотите.

8 голосов
/ 15 ноября 2011

Вы также можете включить JavaScriptHelper непосредственно в класс Sprockets Context (класс, который запускает ваш шаблон):

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

Или даже определить своего помощника где-нибудь еще и включить его в шаблон(чтобы иметь возможность и повторно использовать помощника)

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