Я довольно длинное описание, которое я хочу обрезать с помощью утилиты truncate.
Поэтому я использую:
truncate article.description, :length => 200, :omission => ' ...'
Проблема в том, что я хочу использовать больше в качестве кликабельной ссылки, поэтому в теории я мог бы использовать это:
truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}"
Текст опускания обрабатывается как небезопасный, поэтому он экранирован. Я попытался сделать это html_safe, но это не сработало, вместо ссылки [more] мой браузер по-прежнему показывает html для этой ссылки.
Есть ли способ заставить 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
Ответ 2
С Rails 4 вы можете/должны пройти в блоке для ссылки:
truncate("Once upon a time in a world far far away",
length: 10,
separator: ' ',
omission: '... ') {
link_to "Read more", "#"
}
Ответ 3
Грязное решение... используйте метод "raw", чтобы отменить его.
вы должны быть уверены в "здравомыслии" вашего контента.
raw(truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}")
raw - это помощник, действующий как html_safe.
свидания
edit: это не пропуск экранов, а результат метода truncate.
Ответ 4
Я столкнулся с подобной ситуацией, и это сделало трюк. Попробуйте (разрывы строк для удобочитаемости):
(truncate h(article.description),
:length => 200,
:omission => "... #{link_to('[more]',articles_path(article)}")
.html_safe
Вы можете использовать h для обеспечения здравого смысла описания статьи, и поскольку вы устанавливаете link_to на путь, который, как вы знаете, не является чем-то потенциально гнусным, вы можете без проблем отметить полученную строку как html_safe.
Ответ 5
TextHelper#truncate
имеет блочную форму truncate
, которая позволяет использовать link_to
, который не экранирован, избегая усеченного текста:
truncate("<script>alert('hello world')</script>") { link_to "Read More", "#" }
#=> <script>alert('hello world'...<a href="#">Read More</a>
Ответ 6
Единственный, который работал у меня:
<%= truncate(@article.content, length: 200, omission: " ... %s") % link_to('read more', article_path(@article)) %>
Ответ 7
У меня была та же проблема, в моем случае я просто использовал :escape => false
.
Это сработало:
truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}", :escape => false
Из документации:
Результат помечен как безопасный HTML, но по умолчанию он экранируется, если: escape is false.... ссылка: http://apidock.com/rails/ActionView/Helpers/TextHelper/truncate