传递参数时出现NilClass错误

时间:2016-07-29 18:46:35

标签: ruby-on-rails

在整理数据以便在视图中显示时,我想要使用一个模块。在终端,我试试这个模块

> include BeforeOrAfter
> s = s.Artist.find(1)
> s.events.each do |event|
>   before_or_after(event)
> end

这会导致错误NoMethodError: undefined method '<<' for nil:NilClass。 这是我的模块:

module BeforeOrAfter
  attr_reader :past
  attr_reader :future

  require "date"
  def initialize
    @datetime = DateTime.new
    @future = []
    @past = []
  end

  def before_or_after(event)
    if event.date < DateTime.now
      @past << event.id
    else
      @future << event.id
    end
  end
end

编辑:在控制台中玩了更多并尝试了这个,它的确有效。现在为什么在将所有东西交给模块处理时,这项工作是否有效?

> include BeforeOrAfter
> s = s.Artist.find(1)
> @f = []
> @p = []
> s.events.each do |event|
>   if event.date < DateTime.now
>   @p << event.id
>   else
>     @f << event.id
>   end
> end
> @f
  => [17]

2 个答案:

答案 0 :(得分:1)

您的initialize方法永远不会被调用。您将模块包含在ruby顶级对象中 - 初始化已经被调用。

如果你把它包含在一个更正常的&#34;上课,即

class Foo
  include BeforeOrAfter
end

before_or_after方法应该适用于Foo

的实例

当您在其他课程中包含您无法控制时,您无法保证初始化将被调用,因为该类可能会定义自己的initailize方法。您可以prepend使用您的模块,而不是使用include来确保首先调用initialize。如果您这样做,请确保仍然调用原始initialize(使用super)并且您的初始化采用与原始版本相同的参数。

我可能会在需要时初始化你的2个实例变量,而不是试图挂钩初始化。

答案 1 :(得分:0)

我想将"0.00%"更改为attr_reader :past就可以了。