Rails усекает помощника со ссылкой как пропустить текст

Я довольно длинное описание, которое я хочу обрезать с помощью утилиты 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", "#" }

#=> &lt;script&gt;alert(&#39;hello world&#39;...<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