ActionView :: Template :: Error:未定义的方法'<'为nil:NilClass

时间:2019-09-18 15:49:16

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

在显示(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的未定义方法“ <”

ratings_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

2 个答案:

答案 0 :(得分:0)

由于方法ratings_chart_last_days可能返回nil,因此您可以将其更改为:

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)
  @ratings_chart_last_days ||= 0 # Just added
end

答案 1 :(得分:0)

我不确定您的意图是什么,但是如果您仅查看最近30天制作的电影,而您没有电影,我怀疑chart_position方法可能会返回nil?< / p>

您可以选择将其视为前三名,也可以将其视为未排名。要将其包含在顶部位置,请返回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

为索引