【问题标题】:Rails truncate helper with link as omit textRails 用链接截断帮助器作为省略文本
【发布时间】:2011-02-17 17:11:22
【问题描述】:

我想使用截断助手截断的描述很长。 所以我使用的是:

truncate article.description, :length => 200, :omission => ' ...'

问题是我想使用更多作为可点击链接,所以理论上我可以使用这个:

truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}"

省略文本被视为不安全,因此被转义。我尝试将其设置为 html_safe 但它不起作用,而不是链接 [更多] 我的浏览器仍在显示该链接的 html。

有没有办法强制截断以打印省略链接而不是省略文本?

【问题讨论】:

标签: ruby-on-rails helper truncate


【解决方案1】:

我建议您自己在辅助方法中执行此操作,这样您也可以更好地控制输出:

def article_description article
  output = h truncate(article.description, length: 200, omission: '...')
  output += link_to('[more]', article_path(article)) if article.description.size > 200
  output.html_safe
end

【讨论】:

  • @Pam-Thomakos 这对于一个问题非常有效。当我点击链接时,它会转到 posts.1 而不是 post/1。
  • 应该是单数article_path而不是复数articles_path
  • 截断前的h有什么作用?
【解决方案2】:

使用 Rails 4,您可以/应该为链接传递一个块:

truncate("Once upon a time in a world far far away", 
  length: 10, 
  separator: ' ', 
  omission: '... ') {     
    link_to "Read more", "#" 
}

【讨论】:

  • 这就是为我做的。谢谢!
【解决方案3】:

我遇到了同样的问题,在我的情况下,我只使用了:escape => false。 那行得通:

truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}", :escape => false

来自文档:

结果被标记为 HTML 安全,但默认情况下会转义,除非 :escape 为 false.... 链接:http://apidock.com/rails/ActionView/Helpers/TextHelper/truncate

【讨论】:

    【解决方案4】:

    肮脏的解决方案...使用“原始”方法对其进行转义。
    您必须确保内容的“健全性”。

    raw(truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}")
    

    raw 是一个类似于 html_safe 的助手。
    再见

    edit:不是被转义的遗漏,而是truncate方法的结果。

    【讨论】:

    • 问题是我无法确定 article.description 的合理性
    【解决方案5】:

    我遇到了类似的情况,这成功了。尝试(为了便于阅读换行):

    (truncate h(article.description), 
                      :length => 200, 
                      :omission => "... #{link_to('[more]',articles_path(article)}")
                      .html_safe
    

    您可以使用 h 来确保文章描述的完整性,并且由于您将 link_to 设置为您知道不会有潜在恶意的路径,因此您可以将生成的字符串标记为 html_safe 而无需担心。

    【讨论】:

    【解决方案6】:

    TextHelper#truncate 有一个block form of truncate,它允许您使用未转义的link_to,同时仍然转义截断的文本:

    truncate("<script>alert('hello world')</script>") { link_to "Read More", "#" }
    
    #=> &lt;script&gt;alert(&#39;hello world&#39;...<a href="#">Read More</a>
    

    【讨论】:

      【解决方案7】:

      唯一对我有用的:

      <%= truncate(@article.content, length: 200, omission: " ... %s") % link_to('read more', article_path(@article)) %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-17
        • 2016-10-18
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 2021-08-25
        • 2011-05-17
        相关资源
        最近更新 更多