2011-07-27 9 views
15

Estoy usando Rails 3.1 y las ruedas dentadas.¿Cómo obtengo escape_javascript y otros ayudantes en el archivo js preprocesado de mis piñones (no en una vista)?

Quiero usar ERB para preprocesar un archivo js que luego se incluirá usando javascript_include_tag. Se genera a partir de código, por lo que estoy preprocesándolo con ERB, pero no puedo acceder a los helpers como escape_javascript de ActionView :: Helpers :: JavaScriptHelper

Digamos que mi archivo se llama dynamic.js. erb, y contiene

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

¿Cómo evito que se produzca el error:

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

cuando golpeo mi servidor local y pedir /assets/dynamic.js

Respuesta

12

Puede incluir los rails JS helpers en su propia clase.

class Helper 
    include ActionView::Helpers::JavaScriptHelper 

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

A continuación, utilice en su archivo ERB:

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

Gracias, ¡funcionó! Puse esa clase en la parte superior de mi archivo js.erb – nocache

8

Es posible que también sea incluir JavaScriptHelper directamente en las ruedas dentadas Context clase (la clase que se ejecuta la plantilla):

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

O incluso defina su ayudante en otro lugar e inclúyala en la plantilla (para poder y reutilizar el ayudante)

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

llamada así:

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

Tenga en cuenta que j es un alias para escape_javascript, para que pueda utilizar el nombre largo, si lo prefiere.

Cuestiones relacionadas