2010-03-17 11 views
9

Me pregunto cuál es la mejor práctica para pasar variables a funciones de JavaScript en una vista de carriles. En este momento estoy haciendo algo como:Pasar variables de ruby ​​a la función javascript en la vista de carriles

<% content_for :javascript do %> 
    <script type="text/javascript"> 
    Event.observe(window, 'load', function(){   
     js_function(<%= @ruby_array.to_json %>, <%= @ruby_var %>);)} 
    </script> 
<% end %> 

¿Es esta la manera correcta de hacerlo?

Respuesta

19

algunas opciones:

escape_javascript

Alias: j.

Funciona únicamente en cadenas.

Escapa de caracteres que pueden tener un significado especial en cadenas de Javascript, como escapes de barra invertida, en un formato adecuado para poner dentro de cadenas de texto Javascript las comillas.

Mantiene html_safe estado de la entrada, por lo que necesita html_safe caracteres HTML especiales, como por lo demás < conseguirían escapado a &lt;.

<% a = "\\n<" %> 
<%= javascript_tag do %> 
    '<%= j(a)   %>' === '\\n&lt;' 
    '<%= j(a).html_safe %>' === '\\n<' 
<% end %> 

a_json + html_safe

Como se ha mencionado por Vyacheslav, ir él Upvote.

Funciona porque JSON es almost a subset of Javascript object literal notation.

Funciona no solo en objetos hash, sino también en cadenas, matrices y enteros que son convertidos a fragmentos JSON del tipo de datos correspondiente.

<% data = { key1: 'val1', key2: 'val2' } %> 
<%= javascript_tag do %> 
    var data = <%= data.to_json.html_safe %> 
    data.key1 === 'val1' 
    data.key2 === 'val2' 
<% end %> 

Data- atributos

añadir valores a los atributos, recuperarlos con operaciones Javascript DOM.

mejor con el ayudante content_tag:

<%= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'} %> 
<%= javascript_tag do %> 
    $('#data').data('key1') === 'val1' 
    $('#data').data('key2') === 'val2' 
<% end %> 

A veces llamado "discreta Javascript".

gon

biblioteca especializada para el trabajo: https://github.com/gazay/gon

Probablemente la solución más robusta.

Gemfile:

gem 'gon' 

controlador:

gon.key1 = 'val1' 
gon.key2 = 'val2' 

Disposición app/views/layouts/application.html.erb:

<html> 
<head> 
    <meta charset="utf-8"/> 
    <%= include_gon %> 

Vista:

<%= javascript_tag do %> 
    gon.key1 === 'val1' 
    gon.key2 === 'val2' 
<% end %> 

Ver también

1

Existe una técnica llamada "JavaScript no intrusivo". Aquí hay un Railscast al respecto: link text. Funciona tanto con el prototipo jQuery. También hay complementos que pueden ayudar a simplificar algunas de las tareas descritas en el artículo.

6
- content_for :javascripts_vars do 
    = "var costs_data = #{@records[:cost_mode][:data].to_json}".html_safe 
    = "var graph_data = #{@records[:cost_mode][:graph].to_json}".html_safe 
0

Encontré esa gema client variable, te ayuda a hacerlo fácilmente.

+0

Por favor, intente leer este http://stackoverflow.com/help/deleted -respuestas, para obtener más información sobre cómo ** no ** responder. A saber: "Respuestas que no responden fundamentalmente a la pregunta": ** apenas más que un enlace a un sitio externo ** –

+1

gracias, haré más detalles en mis respuestas – MQuy

0

En HAML puede se presentan datos de modo:

.position{data: {latitude: @claim.latitude.to_json, longitude: @claim.longitude.to_json}} 

:javascript 
    var latitude = $('.position').data('latitude'); 
    var longitude = $('.position').data('longitude'); 
Cuestiones relacionadas