Хаос цитат при публикации данных в атрибуте 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="[{&quot;name&quot;:&quot;id&quot;,&quot;type&quot;:&quot;integer&quot;}]" id="example" method="post">

Javascript с помощью метода данных JQuery

fields = $('#example').attr('data-fields')

Я использую рельсы 2.3.8 и jquery-рельсы 2.2.1

Другие вопросы по тегам