Как я могу получить escape_javascript и другие помощники в своих предварительных обработках js файла (а не в представлении)?
Я использую Rails 3.1 и материал звездочек.
Я хочу использовать ERB для предварительной обработки js файла, который затем будет включен с помощью javascript_include_tag. Он генерируется из кода, поэтому я предварительно обрабатываю его с помощью ERB, но я не могу добраться до помощников, таких как escape_javascript из ActionView:: Helpers:: JavaScriptHelper
Скажите, что мой файл называется 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
Ответы
Ответ 1
Вы можете включить помощники рельсов 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" ) ) )%>"
};
Ответ 2
Вы также можете включить JavaScriptHelper
непосредственно в класс Sprockets Context
(класс, который запускает ваш шаблон):
<% environment.context_class.instance_eval { include ActionView::Helpers::JavaScriptHelper } %>
Или даже определите своего помощника где-то еще и включите его в шаблон (чтобы иметь возможность и повторно использовать помощника)
<% environment.context_class.instance_eval { include MyHelper } %>
Ответ 3
Назовите его следующим образом:
// file.js.erb
var x = "<%= ActionController::Base.helpers.j image_tag('logo.png') %>";
Обратите внимание, что j
является псевдонимом для escape_javascript
, поэтому вы можете использовать длинное имя, если хотите.