Прямые #{}
работает для простых строк, но это не самый масштабируемый/безопасное решение в целом.
Например, буквальный символ обратной косой черты в Рубине бы вызвать проблемы в JavaScript, где он будет интерпретироваться как символ новой строки:
- a = "\\n"
:javascript
'#{ a }' !== "\\n"
Из this awesome Rails cast, могут быть использованы следующие методы:
escape_javascript
Псевдоним: j
.
Работы только на струнах.
Исключает символы, которые могут иметь специальные значения в строках Javascript, , как обратная косая черта, в формат, подходящий для ввода буквенных котировок Javascript.
Поддерживать html_safe
статус входа, поэтому необходимо html_safe
иначе специальные HTML символы, такие как <
бы получить убежали в <
.
- a = "\\n<"
:javascript
'#{ j(a) }' === '\\n<'
'#{ j(a).html_safe }' === '\\n<'
to_json + html_safe
работает, потому что JSON является almost a subset of Javascript object literal notation.
Работает с любым хеш-объектом, включая строки, массивы и целые числа, которые являются , преобразованные в фрагменты JSON соответствующего типа данных.
- data = { key1: 'val1', key2: 'val2' }
:javascript
data = #{ data.to_json }
data.key1 === 'val1'
data.key2 === 'val2'
данных- атрибуты
Добавить значения атрибутов, извлекать их с операциями Javascript DOM.
Лучше с content_tag
помощника:
= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'}
:javascript
$('#data').data('key1') === 'val1'
$('#data').data('key2') === 'val2'
угольник
Библиотека специализируется на работе: https://github.com/gazay/gon
Вероятно, наиболее надежным решением.
Gemfile:
gem 'gon'
Контроллер:
gon.key1 = 'val1'
gon.key2 = 'val2'
Layout app/views/layouts/application.html.erb
:
<html>
<head>
<meta charset="utf-8"/>
<%= include_gon %>
Вид:
:javascript
gon.key1 === 'val1'
gon.key2 === 'val2'
Ответы будут одинаковыми без HAML: http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view –