如何将链接包装到 Ruby 中的 ul li?

How to wrap links into ul li in Ruby?

我为语法文盲道歉,我不必处理Ruby,但有必要在 ul>li 列表中包装链接(ul>li>a 而不是 a)

def links_to_hashtags(hashtags = object.hashtags)
  hashtags.map(&:to_s).map do |hashtag|
    # XXX transitional
    url = h.hashtag_page_enabled? && h.logged_out? ? h.tag_path(hashtag.downcase) : h.hashtag_friends_path(q: hashtag.downcase)
    h.link_to "##{hashtag}", url, dir: h.html_dir(hashtag)
  end.join(' ').html_safe
end

我试过这种方式,但它有一些语法错误:

def links_to_hashtags(hashtags = object.hashtags)
  hashtags.map(&:to_s).map do |hashtag|
    # XXX transitional
    url = h.hashtag_page_enabled? && h.logged_out? ? h.tag_path(hashtag.downcase) : h.hashtag_friends_path(q: hashtag.downcase)
    h.content_tag :ul, class: 'fancy' do
    h.concat h.content_tag :li,
    h.link_to "##{hashtag}", url, dir: h.html_dir(hashtag)
  end.join(' ').html_safe
end   

非常感谢您的回复!

def links_to_hashtags(hashtags = object.hashtags)
  h.content_tag :ul, class: 'fancy' do
    hashtags.map(&:to_s).each do |hashtag|
      concat h.content_tag :li do
        concat link_to_hashtag(hashtag)
      end
    end
  end  
end

def link_to_hashtag(hashtag)
  # prefer if ... else over unreadably long ternary expressions
  url = if h.hashtag_page_enabled? && h.logged_out? 
    h.tag_path(hashtag.downcase) 
  else 
    h.hashtag_friends_path(q: hashtag.downcase) 
  end
  h.link_to ['#', hashtag].join, url, dir: h.html_dir(hashtag)
end

content_tag 这样的每个内容助手都会创建自己的字符串缓冲区。当您在块中使用 concat 时,您正在写入该标记的缓冲区 - 就像您在 ERB 中使用 <%= 时一样。这消除了进行笨重的字符串连接和处理 html 标签被转义的需要。

然而,这确实是您应该考虑使用 a partial 代替的东西。

<ul class="fancy">
  <% hashtags.each do |hashtag| %>
    <li><%= link_to_hashtag(hashtag) %></li>
  <% end %>
</ul>