2016-07-29 89 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