【问题标题】:How to limit tag_counts items when using acts_as_taggable使用acts_as_taggable时如何限制tag_counts个项目
【发布时间】:2020-06-29 05:07:20
【问题描述】:

我在我的播客页面上使用“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(' ')

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

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

【问题讨论】:

  • 总有办法,请用你真正想做的和你尝试过的更新问题。

标签: ruby-on-rails ruby haml act-as-taggable-on


【解决方案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

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

你需要梳理一下你的业务逻辑,才能给出更简洁的答案。

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

【讨论】:

  • 您非常正确,代码不应该出现在视图中。视图只负责渲染,不查找或计算值。实际上,在所有方面都同意。
  • @theTinMan,谢谢您的评论,我的回答仍然不完全正确,因为控制器应该确保实例变量可供视图使用,但是看起来 OP 有得到了他们想要的答案。
【解决方案2】:

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

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

第一部分返回一个ArrayArray#first 会将结果“限制”为 10,在本例中:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 2018-05-02
    • 2021-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2021-02-04
    • 2016-12-05
    相关资源
    最近更新 更多