【问题标题】:Middleman tag sort case insensitive中间人标签排序不区分大小写
【发布时间】:2017-03-18 19:18:22
【问题描述】:

在 Middleman 静态站点生成器中,对 tags 数组进行排序区分大小写。大写字母排在小写之前,使用代码时如:“A, B, C, a, b, c”:

<% blog.tags.sort.each do |tag, articles| %>
<% end %>

看来我应该可以使用Ruby的sort_by(&amp;:downcase),比如:

<% blog.tags.sort_by(&:downcase).each do |tag, articles| %>
<% end %>

但这给出了错误:

无方法错误

#<0x007fc4baac00b8>

  • &lt;&gt;

标签: arrays ruby sorting tags middleman


【解决方案1】:

blog.tags 实际上是在一个数组中返回多个 ruby​​ 对象。所以错误 Array:0x007fc4baac00b8 的未定义方法“downcase”是因为 blog.tags 看起来类似于下面的内容。

[
 #<Array:0x007f9a41300cb8 id: 5, name: "Ruby">,
 #<Array:0x007f9a41300cb8 id: 5, name: "Ruby">,
]

我不肯定您在标签上使用活动记录,但您可以在标签模型类中对它们进行排序。

 class Tag < ActiveRecord::Base
  scope :order_by_name, -> { order('LOWER(name)') }
 end

 # erb 
 <% blog.tags.order_by_name.each do |tag, articles| %>
 <% end %>

【讨论】:

    【解决方案2】:

    这种排序不区分大小写:sort{|a,b| a.to_s.downcase &lt;=&gt; b.to_s.downcase}

    应用于erb文件中的MiddlemanTag类实例为:

    <% blog.tags.sort{|a,b| a.to_s.downcase <=> b.to_s.downcase}.each do |tag, articles| %>
    <% end %>
    

    【讨论】:

    • 这完全等同于 OP 的代码 blog.tags.sort_by(&amp;:downcase).each do |tag, articles|。如果原件不起作用,这也不行。
    • blog.tags 不是字符串数组,必须至少包含一个数组作为元素。因此出现错误。
    • @EricDuminil Middleman 博客模块将标签定义为:@return [Array&lt;String&gt;] (never +nil+)
    • @JasonSturges 您可以在代码(甚至是 ERB 模板)中放入调试器调用,例如 byebug,并在运行时对其进行检查/运行测试。
    猜你喜欢
    • 2019-01-31
    • 2020-09-13
    • 2012-06-22
    • 1970-01-01
    • 2014-05-20
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多