Come passare le variabili Ruby a una funzione JavaScript in una vista Rails?

Mi sto chiedendo quale sia la procedura migliore per il passaggio di variabili alle funzioni JavaScript in una visualizzazione di binari. In questo momento sto facendo qualcosa come:

  Event.observe(window, 'load', function(){ js_function(, ); )}   

È questo il modo giusto per farlo?

Alcune opzioni:

escape_javascript

Alias: j .

Funziona solo su stringhe.

Consente di sfuggire i caratteri che possono avere significati speciali nelle stringhe di Javascript, come i backslash escape, in un formato adatto per inserire citazioni letterali stringa JavaScript.

Mantiene html_safe stato di input html_safe , quindi ha bisogno di html_safe altrimenti caratteri HTML speciali come < verrebbero scappati in < .

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

to_json + html_safe

Come menzionato da Vyacheslav, andare su di lui.

Funziona perché JSON è quasi un sottoinsieme della notazione letterale dell'object Javascript .

Funziona non solo su oggetti hash, ma anche su stringhe, matrici e interi che vengono convertiti in frammenti JSON del tipo di dati corrispondente.

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

dati-attributi

Aggiungi valori agli attributi, recuperali con le operazioni DOM Javascript.

Meglio con l'helper 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 volte chiamato "non invadente Javascript".

gon

Biblioteca specializzata per il lavoro: https://github.com/gazay/gon

Probabilmente la soluzione più robusta.

Gemfile:

 gem 'gon' 

controller:

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

Layout app/views/layouts/application.html.erb :

    <%= include_gon %> 

Vista:

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

Guarda anche

  • Iniezione di valori variabili in javascript e HAML in RoR
 - 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 

C’è una tecnica chiamata “javascript non invadente”. Ecco un Railscast al riguardo: link text . Funziona sia con il prototipo di un jQuery. Esistono anche plugin che possono aiutare a semplificare alcune delle attività descritte nell’articolo.

Ho trovato la variabile client gem, ti aiuta a farlo facilmente.

In HAML i dati possono essere presentati così:

 .position{data: {latitude: @claim.latitude.to_json, longitude: @claim.longitude.to_json}} :javascript var latitude = $('.position').data('latitude'); var longitude = $('.position').data('longitude');