【问题标题】:How do I interact with a collection in a helper but only return a specific output not the entire collection?如何与帮助程序中的集合进行交互,但只返回特定输出而不是整个集合?
【发布时间】:2015-08-02 09:14:55
【问题描述】:

在我看来,我有这个:

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

但是,我想做的是创建一个辅助方法,只要有 5 个 tagged_users,它就会显示最后 3 个的头像,然后在文本“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 方式执行此操作的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 helpers


    【解决方案1】:

    如果您希望助手吐出 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
    

    【讨论】:

    • 我会做些小改动以保持清洁 node.tagged_users.first(avatar_count = 3).each 然后在下面使用 node.tagged_users.count - avatar_count 这样数字不会在 2 个位置重复,一个更改将反映在另一个位置
    • 啊...有趣的优化@MohammadAbuShady。谢谢。
    • @daslicious - 我试图找出一种从帮助程序(而不是视图)中迭代集合的方法。但怀疑它是否可以工作。
    • 啊...对....content_tag....这就是我所缺少的!惊人的。公认。谢谢。
    【解决方案2】:

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

    【讨论】:

    • 返回视图的内容是什么?它是方法中的每一行吗?如何在不输出到视图的情况下跟踪显示的每个头像,直到达到限制?即我通常只会在方法中做一个局部变量,然后以这种方式递增/递减。但是,如果将那个局部变量发送到视图,那就不太适用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    相关资源
    最近更新 更多