Могу ли я создать массив ссылок, используя 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/