Как передать переменные Ruby в функцию JavaScript в представлении Rails?

Мне интересно, какова наилучшая практика передачи переменных в функции JavaScript в представлении rails. Прямо сейчас я делаю что-то вроде:

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

это правильный способ сделать это?

5 ответов


вариантов несколько:

escape_javascript

псевдоним: j.

работает только со строками.

экранирует символы, которые могут иметь специальные значения в строках Javascript, как и обратные косые черты, в формат, подходящий для размещения внутри строковых буквенных кавычек Javascript.

поддерживает html_safe состояние входного сигнала, так нужно html_safe в противном случае специальные HTML-символы, такие как < бы убежал в &lt;.

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

to_json + html_safe

как уже упоминал Вячеслав, идите его поднимать.

работает, потому что JSON почти подмножество буквенных обозначений объектов Javascript.

работает не только на хэш-объектах, но и на строках, массивах и целых числах, которые преобразуется в фрагменты JSON соответствующего типа данных.

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

сведения- атрибуты

добавьте значения в атрибуты, извлеките их с помощью операций Javascript DOM.

С content_tag помощник:

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

иногда называется "ненавязчивый Javascript".

Гон

библиотека специализированная для работы:https://github.com/gazay/gon

вероятно, самый надежный решение.

Gemfile:

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

планировка app/views/layouts/application.html.erb:

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

вид:

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

см. также


- 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

есть техника под названием "ненавязчивый javascript". Вот Railscast о нем: текст ссылки . Он работает как с прототипом jQuery. Есть также плагины, которые могут помочь упростить некоторые из задач, описанных в статье.


Я нашел этот камень переменной Client, это поможет вам сделать это легко.


в HAML can данные представлены так:

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

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