【问题标题】:to_sentence and html_safe, together?to_sentence 和 html_safe,在一起吗?
【发布时间】:2012-03-30 13:47:07
【问题描述】:

这是我想要的字符串:

<a href="/pugs/1-baxter">Baxter</a> and <a href="/pugs/2-sofia">Sofia</a>

这是我用来输出的代码:

<%= @pugs.collect {|p| link_to(p.name, pug_path(p))}.to_sentence %>

不幸的是,输出正在被编码:

 &lt;a href=&quot;/pugs/1-baxter&quot;&gt;Baxter&lt;/a&gt; and &lt;a href=&quot;/pugs/2-sofia&quot;&gt;Sofia&lt;/a&gt;

我尝试过使用html_saferaw,但它们似乎没有任何影响。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 sanitization


    【解决方案1】:

    从 Rails 5 开始,有一个 to_sentence 视图助手(不同于 Array#to_sentence)可以执行此操作。

    来自the docs

    to_sentence(数组,选项 = {})
    将数组转换为逗号分隔的句子,其中最后一个元素由 连接词。这是 ActiveSupport 的 html_safe 感知版本 数组#to_sentence。

    像这样使用它:&lt;% to_sentence(@pugs.collect {|p| link_to(p.name, pug_path(p))}) %&gt;

    【讨论】:

      【解决方案2】:
      <%= @pugs.collect {|p| link_to(p.name, pug_path(p))}.to_sentence.html_safe %>
      

      【讨论】:

      • 它确实有效。那么可能还有其他问题:)
      • 这很糟糕。您将整个字符串标记为安全。如果您将 p.name 设置为恶意内容,您会看到您的方法允许它未经转义进入页面。
      【解决方案3】:

      您可以将它包装在一个跨度中并使用帮助器:

        def content_link_to(name,path=nil,options=nil)
          content_tag :span do
            link_to name, path, options
          end
        end
      

      并按如下方式使用:

      <%= @pugs.collect {|p| content_link_to(p.name, pug_path(p))}.to_sentence %>
      

      【讨论】:

      • 在这些链接周围添加额外的 HTML 只是为了输出 html 安全内容似乎有点过头了。我只想让 Rails 输出实际的 HTML 而不是转义它。
      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多