Хаос цитат при публикации данных в атрибуте html
Я хочу опубликовать некоторые данные в качестве атрибута HTML. Предположим, что существует переменная rails
@fields = [{:name => "id", :type => :integer}]
Я хочу опубликовать на странице для использования с.data() jquery. Так что в.html.erb у меня есть
<%= form_tag( {:action => 'whatever'}, {... , :"data-fields" => h(@fields.to_json)}) %>
Но при рендеринге, цитаты в строке [{"name":"id","type":"integer"}]
испортить другие атрибуты, потому что Rails form_tag использует двойные кавычки, чтобы заключить всю строку JSON в двойные кавычки. Как мне опубликовать JSON со строками в качестве атрибута от Rails?
5 ответов
Ты пытался escape_javascript
? Несмотря на известные недостатки, он не предназначен для экранирования JSON, и я не уверен, что экранированные кавычки будут работать в атрибутах HTML.
Вы пробовали следующее?
<%= form_tag { :action => "whatever" }, { :data => { :fields => h(@fields.to_json) } } %>
На Railscast есть эпизод, в котором рассматривается ваша ситуация с использованием сериализатора. Дело в том, что сериализатор заменяет двойные кавычки на $quot; Сериализатор также дает вам возможность выбрать, какие атрибуты сериализовать и включить ассоциации.
Вот как я обошел проблему:
В теге формы я сделал :"data-fields" => @fields.to_json.gsub('"',"'")
,
Это производит HTML этого вида:
"data-fields"="[{'name':'id','type':'integer'}]"
И затем, в JS, я получаю это так:
$.parseJSON($('form').data('fields').replace(/'/g,'"'))
После некоторых проб и ошибок это то, что работает.
Сторона сервера:
<% @fields = [{:name => "id", :type => :integer}] %>
<%= form_tag( '/posts/new', {id:'example',:data => { :fields=>@fields}}) %>
Сгенерированный HTML:
<form accept-charset="UTF-8" action="/posts/new" data-fields="[{"name":"id","type":"integer"}]" id="example" method="post">
Javascript с помощью метода данных JQuery
fields = $('#example').attr('data-fields')
Я использую рельсы 2.3.8 и jquery-рельсы 2.2.1