首页 > 解决方案 > ActionView::Template::Error: nil:NilClass 的未定义方法 `<'

问题描述

在显示(html)页面中我有这个

<% if  @movie.views_count > 150 && @movie.ratings_chart_last_days(30) < 4 %>
    You are in the first 3 positions
<% end %>

在 movie.rb 我有这个

  def ratings_chart_last_days(number_of_days)
    subset = Movie.where('movies.created_at >= ?', number_of_days.days.ago)
    @ratings_chart_last_days ||= chart_position(:ratings_abs, subset)
  end

但我有这份报告:

nil:NilClass 的未定义方法“<”

rating_chart_last_days 方法返回 nil。然后,当它尝试进行 < 比较时,它会尝试执行 < 方法。NilClass 不支持该方法。

怎么解决?!

已编辑

图表位置代码

module Chartable
  def chart_position(attribute, start_query = nil)
    attribute = self.class.connection.quote_column_name(attribute.to_s)
    partition = partition_by(start_query || self.class.all, attribute)
    self.class.from(partition, :s).select('s.id, s.position')
        .find_by('s.id = ?', id).try(:position)
  end

  private

  def partition_by(chain, attribute)
    chain
      .select('id, ROW_NUMBER() OVER ('\
              "ORDER BY #{attribute} DESC, created_at DESC"\
              ') as position')
  end
end

标签: ruby-on-railsruby-on-rails-5

解决方案


我不确定你的意图是什么,但如果你只看过去 30 天内创作的电影而你没有,我怀疑chart_position方法可能会返回nil

您可以强制将其视为前三名,也可以强制将其视为未排名,您的选择。要将其包含在顶部位置,请返回,0否则返回Float::INFINITY

def ratings_chart_last_days(number_of_days)
  @ratings_chart_last_days ||= {}
  return @ratings_chart_last_days[number_of_days] if @ratings_chart_last_days[number_of_days].present?
  subset = Movie.where('movies.created_at >= ?', number_of_days.days.ago)
  @ratings_chart_last_days[number_of_days] ||= chart_position(:ratings_abs, subset) || Float::INFINITY
end

我还更改了您的记忆...@ratings_chart_last_days无论number_of_days参数如何,您总是返回,所以我建议它@ratings_chart_last_days应该是所有先前计算结果的哈希,索引为number_of_days


推荐阅读