Могу ли я создать массив ссылок, используя link_to в Rails?

У меня есть список значений в парах url/title, которые я бы хотел отобразить. (Более конкретно, каждый объект имеет свой собственный список ссылок, некоторые с 0, некоторые с 1, некоторые с большим числом.) Я хотел бы, чтобы они отображались в списке, разделенном запятой. Поэтому я написал это в файле .erb:

<%= links.map{|wl| link_to wl.title, wl.url}.join(', ') %>

Скорее всего, это показало список HTML-кода, разделенный запятыми, для ссылок, которые я хотел создать; то есть он принимает все угловые скобки и кодирует их амперсанд. Чтобы убедиться, что в функциях более высокого порядка не было ничего смешного, я попробовал более настоятельную версию:

<% a = [] %>
<% links.each do |wl| %>
  <% a << link_to(wl.title, wl.url) %>
<% end %>
<%= a.join(', ') %>

с, конечно, тем же результатом. Но я не думаю, что я злоупотребляю link_to, потому что если я изменю это на

<% links.each do |wl| %>
  <%= link_to(wl.title, wl.url) %>,
<% end %>

то он фактически создает ссылки. Это почти то, что я хочу, за исключением того, что после последней есть дополнительная запятая. Есть ли какая-то магия под капотом с link_to, что заставляет ее действовать по-разному в зависимости от того, куда идет ее выход? Есть ли способ обойти эту магию? Семантика join была бы именно то, что я хочу здесь, и я могу, очевидно, выяснить, как свертывать свои собственные (используя, вероятно, each_index), но похоже, что это очень тяжелое и нерубивное решение того, что должно быть общей проблемой.

Ответ 1

В то время как предложения по использованию html_safe получат результат, который вы собираетесь использовать, я предлагаю вам не придерживаться таких циклов, как в вашем представлении. В рельсах есть отличный способ сделать то, что вы ищете:

В вашем основном файле вида, в котором вы сейчас используете свой цикл, измените его на следующее:

<%= render partial: 'links/link', collection: links, spacer_template: 'shared/comma' %>

Затем создайте частичный links/_link.html.erb

<%= link_to link.title, link.url %>

Затем создайте частичный shared/_comma.html.erb

,

Самое приятное в этом подходе - вам не нужно беспокоиться, действительно ли ваш контент ссылки безопасен, и если вы решите перечислить или изменить его другим способом, это просто, как изменение одного или обоих шаблонов. Например, если вместо запятых вы решили, что хотите, чтобы она была вертикальной, и используйте <br> вместо , в шаблоне spacer.

Ответ 2

Используйте safe_join в сочетании с html_safe в строке разделителя.

Пример:

<%= safe_join(links.map { |l| link_to(l.title, l.url) }, ", ".html_safe) %>

Ответ 3

Try

<%= links.map{|wl| link_to wl.title, wl.url}.join(', ').html_safe %>

Это указывает Rails не пропускать текст.

Ответ 4

Попробуйте поместить это в свой ApplicationHelper

  def sep(separator)
    ->(a, b){ a << separator.html_safe << b }
  end

Затем сделайте это в своем шаблоне

links.map{|wl| link_to wl.title, wl.url}.reduce(&sep(", "))

Вы можете использовать любой разделитель, который вам нравится. Вам также не нужно называть html_safe на все это. Только разделитель. Таким образом, этот метод более безопасен.

Ответ 5

Rails конвертирует строки по умолчанию в html. Ваш вызов соединения превращает вывод ссылок в строку, поэтому текст исчезает. Попробуйте добавить .html_safe после вызова соединения, который скажет рельсы, что текст, который вы предоставляете, является html безопасным, и поэтому его не нужно экранировать. Там больше о том, как это работает: http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/