1

我在我的播客页面上使用“acts_as_taggable_on”gem。

tag_counts使用此 HAML 代码显示所有标签:

#tag_cloud
    %h3
       = raw Podcast.tag_counts.sort{ |x, y| x.name.upcase <=> y.name.upcase }.map{  |p| link_to p.name, podcasts_path(tag: p.name), remote: true}.join(' ')

我认为它会显示一团糟,因为标签会不断创建。我只想显示一行,如果标签在行上,将显示一个按钮,访问者可以单击它以将它们全部附加。

有没有办法可以限制tag_counts“acts_as_taggable”中的项目?

4

2 回答 2

1

只需first()在排序、映射、然后连接的行中使用:

Podcast.tag_counts.sort { ... }.map { ... }.join(' ')

第一部分返回一个Array,并将Array#first结果“限制”为 10,在此示例中:

Podcast.tag_counts.sort { ... }.map { ... }.first(10).join(' ')

在您的代码中,极长的行很笨拙,您应该重新组织或分解它。

于 2020-06-29T05:32:35.840 回答
1

该代码不属于视图,您应该在 Podcast 类中编写一个类方法,名称可能类似于get_tag_cloud,并返回您希望在视图中显示的结果。

当然,您可以限制返回的记录数,但您想限制什么逻辑呢?

你可以这样做:

class Podcast < ApplicationRecord
  def self.get_tag_cloud
    tag_counts.limit(20).sort{ |x, y| x.name.upcase <=> y.name.upcase }.map{  |p| link_to p.name, podcasts_path(tag: p.name), remote: true}.join(' ')
  end
 
  #...
end

然后你的观点变成:

 = raw Podcast.get_tag_cloud

但我真的不认为那是你想要的。您如何优先考虑应该显示哪些标签以及应该忽略哪些标签,如果一个标签总是被省略,那么允许该标签的意义何在?

您需要理清您的业务逻辑,然后才能提供更简洁的答案。

你真的需要问一个不同的问题。

于 2020-06-29T05:36:20.433 回答