Метод ретро с использованием параметра функции возможен, но вы должны правильно экранировать передаваемую переменную с помощью escape_javascript или to_json + html_safe , как описано ниже.
Однако, так как вы хотите воздействовать на внешние файлы, лучшими методами будет использование gon . Еще одна хорошая возможность - использовать атрибуты данных .
гон
Камень, специализированный для работы: https://github.com/gazay/gon
Пожалуй, самое надежное решение.
Gemfile:
gem 'gon'
Контроллер:
gon.timeleft = 1
Макет app/views/layouts/application.html.erb
:
<html>
<head>
<meta charset="utf-8"/>
<%= include_gon %>
<%= javascript_include_tag 'application' %>
Файл актива:
gon.timeleft === 1
атрибуты данных
Добавление значений к атрибутам, получение их с помощью операций JavaScript DOM.
Иногда его называют "ненавязчивым Javascript".
Просмотр головы:
<%= javascript_include_tag 'application' %>
Просмотр тела:
<%= content_tag 'div', '', id: 'data', data: {timeleft: '1'} %>
Файл актива:
$(function() {
parseInt($('#data').data('key1')) === 1
})
Следующее иллюстрирует, как escape_javascript
и to_json
работают для вас поверх ответа ретро.
escape_javascript
Псевдоним: j
.
Работает только со строками.
Экранирует символы, которые могут иметь особое значение в строках JavaScript,
подобно обратной косой черте, в формат, подходящий для размещения строковых литералов JavaScript в кавычках.
Поддерживает html_safe
статус ввода,
поэтому необходимо html_safe
в противном случае специальные символы HTML, такие как <
, будут экранированы в <
.
<% a = "\\n<" %>
<%= javascript_tag do %>
f('<%= j(a) %>') // === '\\n<'
f('<%= 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 %>
f(data.key1) \\ === 'val1'
f(data.key2) \\ === 'val2'
<% end %>