如何与助手中的集合交互,但仅 return 特定输出而不是整个集合?

How do I interact with a collection in a helper but only return a specific output not the entire collection?

在我看来,我有这个:

<% node.tagged_users.each do |tagged_user| %>
   <li><%= display_avatar_or_email(tagged_user) %></li>
<% end -%>

但是,我想做的是创建一个辅助方法,只要有 5 个 tagged_users,它就会显示最后 3 个的头像,然后在 link文本“2 more”或“2+”(根据下图)。请注意,它不应该显示标记的用户总数,只是当前显示为头像的标记用户数与该特定节点的标记用户总数之间的差异。

所以它看起来像这样:

不确定这是否重要,但是 display_avatar_or_email(tagged_user) 的方法如下所示:

  def display_avatar_or_email(user)
    link_to image_tag(user.avatar.url, size: "48x48", :class => "img-circle", title: user_name_or_email(user)), user
  end

我有一个方法 tagged_users.count:

  def total_tagged_users_count(node)
    node.user_tags.count
  end

当我将整个 node.tagged_users.each do |tagged_user| 移动到我的助手中时,它会在我的视图中吐出整个 AR 集合 - 这不是我想要的。我只想要逻辑的结果,而不是方法中的所有内容。

在助手中以 Rails 方式执行此操作的最佳方法是什么?

而不是在您创建的助手中使用 .each..您不应该使用 .map 吗?然后隐式 return 将是结果,而不是整个集合中的每个循环。

如果你想让助手吐出 html 使用 content_tag 或将原始 html 写成字符串。我有点喜欢 content_tag.

def some_helper node
  node.tagged_users.first(3).each do |tagged_user|
    content_tag(:li, display_avatar_or_email(tagged_user))
  end
  content_tag(:li, (node.tagged_users.count - 3))
end