Rails усекает помощника со ссылкой в ​​виде пропущенного текста - PullRequest
10 голосов
/ 17 февраля 2011

У меня довольно длинное описание, которое я хочу обрезать с помощью помощника усечения.Поэтому я использую:

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

Проблема в том, что я хочу использовать больше как ссылку, по которой можно кликать, поэтому теоретически я мог бы использовать это:

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

Обработан текст пропускакак небезопасно, так что сбежал.Я пытался сделать его html_safe, но он не работал, вместо ссылки [подробнее] мой браузер все еще показывает HTML для этой ссылки.

Есть ли способ заставить усечение печатать ссылку пропуска вместо текста пропуска?

Ответы [ 7 ]

11 голосов
/ 11 ноября 2014

В Rails 4 вы можете / должны передать блок для ссылки:

truncate("Once upon a time in a world far far away", 
  length: 10, 
  separator: ' ', 
  omission: '... ') {     
    link_to "Read more", "#" 
}
10 голосов
/ 17 февраля 2011

Я бы посоветовал сделать это самостоятельно с помощью вспомогательного метода, чтобы у вас также было немного больше контроля над выводом:

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
7 голосов
/ 17 февраля 2011

Грязный раствор ... используйте метод "raw", чтобы удалить его.
Вы должны быть уверены в «здравомыслии» своего контента.

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

raw - помощник, действующий как html_safe.
прощай

edit: это не пропуск экранирования, а результат метода усечения.

4 голосов
/ 21 ноября 2012

Я столкнулся с подобной ситуацией, и это помогло. Попробуйте (разрывы строк для удобства чтения):

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

Вы можете использовать h, чтобы обеспечить правильность описания статьи, и, поскольку вы устанавливаете link_to на путь, который, как вы знаете, не является чем-то потенциально опасным, вы можете пометить полученную строку как html_safe, не беспокоясь.

2 голосов
/ 25 ноября 2013

TextHelper#truncate имеет блочную форму 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>
1 голос
/ 31 января 2017

У меня была такая же проблема, в моем случае я просто использовал :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

1 голос
/ 11 марта 2014

Единственное, что у меня сработало:

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