【问题标题】:quotation havoc while posting data in html attribute在 html 属性中发布数据时引用破坏
【发布时间】:2013-02-16 13:46:06
【问题描述】:

我想将一些数据作为 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 作为属性?

【问题讨论】:

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


    【解决方案1】:

    您是否尝试过以下方法?

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

    【讨论】:

    • 这产生了与我的问题相同的问题
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 序列化器用于活动记录。如何像 erb 文件中的问题一样简单地为 rails 哈希/数组编写 json?
      【解决方案4】:

      经过一些试验和错误,这是可行的。

      服务器端:

      <% @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">
      

      带有 JQuery 数据方法的 Javascript

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

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

      【讨论】:

      • 对我不起作用。生成的 HTML 是 &lt;form accept-charset="UTF-8" action="/organisms/queue_upload" class="form-horizontal" data-fields="[{"name":"id","type":"integer"}]" id="map_form" method="post"&gt; 双引号到处乱七八糟,因此浏览器将其解释为 &lt;form method="post" id="map_form" name":"id","type":"integer"}]"="" data-fields="[{" class="form-horizontal" action="/organisms/queue_upload" accept-charset="UTF-8"&gt;
      【解决方案5】:

      以下是我回避问题的方法:

      在表单标签中,我做了:"data-fields" =&gt; @fields.to_json.gsub('"',"'")

      这会产生这种 HTML:

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

      然后,在 JS 中,我像这样检索它:

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

      【讨论】:

      • 我知道这可能有点“副业”,但您是否考虑过将 json 文件中的每个项目作为单独的数据字段发送?例如。 “数据ID”和“数据类型”。我将此作为评论发布,因为它不是您问题的答案,但仍然是您问题的可能解决方案。我只是在想,当您可以寻找更简单的解决方案时,您可能会使事情变得过于复杂。我绝不是说我的就是完美的……
      • 它;在这种情况下可能会变通,我有一个数组[{id:1,type:a},{id:2,type:z},...],所以我可以创建两个数组,然后使用索引来链接它们。在一般情况下,虽然应该有一种附加有效 json 属性的方法。
      • 从技术上讲,你是对的。这应该是可能的。然而,从逻辑上讲,这不是经常发生的事情,所以他们可能没有想到哈哈。如果你弄明白了,请告诉我们。这很有用:P
      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多