在整理数据以便在视图中显示时,我想要使用一个模块。在终端,我试试这个模块
> 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 :(得分: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
就可以了。