2016-07-29 88 views
0

我有一个模块,当整理数据以在视图中显示时,我想使用它。在终端方面,我尝试将模块从这样传递参数时发生NilClass错误

> 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] 

回答

0

我想像改变attr_reader :pastattr_accessor :past会做到这一点。

+0

仍然是一样的错误 – sivanes

+0

你在这里的基础实现似乎在IRB中适用于我。我将它包含在一个对象中,提供一个定义了日期属性的OpenStruct,它不会引发错误。所以是的,我的初步答案可能不正确:) 当我喂食obj.before_or_after OpenStruct但没有定义日期时,它确实返回了'NoMethodError:未定义的方法'<'为nil:NilClass'错误。我意识到你将错误报告为'<<',只是再次检查这不是同一个问题。如果是这样,那么你可能想检查你的事件对象,并确保他们有一个日期属性。 – josh

+0

如果我将'.date'取出并使其成为'如果事件 sivanes

1

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

如果你在一个更“正常”类包含了它,即

class Foo 
    include BeforeOrAfter 
end 

before_or_after方法应富

包括你不用管其他类时,你的工作情况不能保证初始化将被调用,因为该类可能会定义它自己的初始化方法。你可以用你的模块prepend而不是使用include来确保你的initialize被首先调用。如果你这样做,请确保你仍然调用原始的initialize(与super),并且你的初始化和原始参数一样。

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

+0

中添加了一些更多信息我已经将它包含在application_controller中,因为我目前所有的控制器都需要它。 – sivanes

+0

好的,我需要在哪里使用prepend和call super? – sivanes