在html属性中发布数据时报价严重

时间:2013-03-01 22:55:37

标签: ruby-on-rails json jquery html html-escape

我想将一些数据发布为html属性。假设有一个rails变量

@fields = [{:name => "id", :type => :integer}]

我想在页面中发布与jquery的.data()一起使用。所以在.html.erb中我有

<%= form_tag( {:action => 'whatever'}, {... , :"data-fields" => h(@fields.to_json)}) %>

但是在渲染时,字符串[{"name":"id","type":"integer"}]中的引号会混淆其他属性,因为Rails form_tag使用双引号将整个json字符串括在双引号中。如何使用Rails将字符串作为属性发布json?

5 个答案:

答案 0 :(得分:0)

您是否尝试过以下操作?

<%= form_tag { :action => "whatever" }, { :data => { :fields => h(@fields.to_json) } } %>

答案 1 :(得分:0)

以下是我如何解决问题:

在表单标记中,我执行了:"data-fields" => @fields.to_json.gsub('"',"'")

这会产生这种类型的HTML:

"data-fields"="[{'name':'id','type':'integer'}]"

然后,在JS中,我检索它:

$.parseJSON($('form').data('fields').replace(/'/g,'"'))

答案 2 :(得分:0)

你试过escape_javascript吗?虽然它有known downsides,但它并不完全是为了转义JSON,我不确定转义引号是否适用于HTML属性。

答案 3 :(得分:0)

使用序列化程序解决您的情况episode on railscasts。关键是序列化器用$ quot替换双引号; serialuzer还使您能够选择要序列化的属性并包含关联。

答案 4 :(得分:0)

经过一些反复试验后,这是有效的。

服务器端:

<% @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')

我正在使用rails 2.3.8和jquery-rails 2.2.1