【问题标题】:Is it possible to render readable (unescaped) json into HTML data-attributes?是否可以将可读(未转义)的 json 呈现为 HTML 数据属性?
【发布时间】:2015-06-04 08:37:24
【问题描述】:

我们正在将 json 渲染为 ERB 中的数据属性。例如:

location.html.erb

<div data-location="<%= render 'location_json' %>">

location_json.erb

<%= @location.to_json(
      only: [:id, :name, :lat, :lng],
      method: [:display_name]) %>

呈现的 html 看起来像:

<div data-location="{&quot;id&quot;:16,&quot;lat&quot;:&quot;35.688195&quot;,&quot;lng&quot;:&quot;-82.564652&quot;,&quot;name&quot;:&quot;Mountain&quot;}">

但我希望它更具可读性,例如:

&lt;div data-location='{"id":16, "lat":35.688195, "lng":-82.564652, "name":"Mountain"}'>

有没有办法告诉 ERB 或 to_json 用单引号而不是转义双引号来呈现?

是否可以将可读的 json 呈现为 HTML 数据属性。通过可读性,我的意思是最少的转义。

【问题讨论】:

  • 您需要escape_javascriptraw 的某种组合。
  • 对数据属性值使用单引号的问题是json不会转义单引号,所以这会中断:

标签: ruby-on-rails json


【解决方案1】:

location.html.erb

 <div data-location="<%= @location.to_json %>">

参考: http://api.rubyonrails.org/classes/ERB/Util.html#method-c-json_escape

【讨论】:

    【解决方案2】:

    不可能在不破坏 html 页面的情况下在数据属性中使用未转义的 JSON。

    但是,可以使用比 Rails/ERB 默认值更具可读性的转义 JSON。

    默认情况下,ERB 会转义双引号,这使得 JSON 特别难以阅读。而是

    • 对 html 数据属性使用单引号
    • 调用 raw 以防止 ERB 在您的字符串上使用默认转义
    • 转义字符串中除双引号外的所有 html 重要字符

    helper.rb

    def my_html_escape(s)
      { '&' => '&amp;', '>' => '&gt;', '<' => '&lt;', "'" => '&#39;' }.each do |k,v|
       s = s.gsub(k,v)
      end
      s
    end
    

    location.html.erb

    <div data-location='<%= raw my_html_escape(@location.to_json) -%>'>
    

    生产

    <div data-location='{"id":16, "lat":35.688195, "lng":-82.564652, "name":"Mountain"}'>
    

    【讨论】:

      【解决方案3】:

      任何 gsub.(/'/, '') 也会转义引号。

      您甚至可以创建一个表并遍历 json 的响应,将 key 放在第一个 td 中,将 value 放在第二个中。如果你有一两个 jsons 会很好。如果您有很多元素数量有限,请为每个元素创建一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-01
        • 2013-06-24
        • 2015-06-16
        • 2021-01-14
        • 1970-01-01
        相关资源
        最近更新 更多