我不确定如何在不发布整个框架的情况下最好地展示我的问题。
我有一个方法duplicate!
,它应该复制一个对象(通道)。通常它可以工作,但有一个通道,方法失败,我只是不明白为什么:
def duplicate!
channel = Channel.new do |c|
c.title = title << ' (copy)'
c.description = description
end
channel.nodes += nodes
playlist.nodes.each { |n| channel.playlist.playlist_items.create(node: n) }
channel
end
如上所述几乎所有频道都没有问题,但现在我有一个频道无法复制:
2.3.0 :002 > channel.duplicate!
NoMethodError: undefined method `playlist_items' for nil:NilClass
from /var/www/app/models/channel.rb:110:in `block in duplicate!'
from /var/www/app/models/channel.rb:110:in `each'
from /var/www/app/models/channel.rb:110:in `duplicate!'
每个频道都有节点和播放列表,错误产生频道也有。 我真的不明白这个错误;该方法如何失败取决于要复制的对象?
答案 0 :(得分:1)
这是失败的原因是因为您的某个频道没有播放列表记录。所以这一行失败了
playlist.nodes.each { |n| channel.playlist.playlist_items.create(node: n) }
对于没有playlist
记录channel.playlist
的频道会返回nil
,因此当您执行channel.playlist.playlist_items
时,您正在呼叫nil.playlist_items
,并且从{{1}开始1}}没有你得到错误的方法。
你可以这样做,而不是制作你的重复方法fyi
nil
这将复制对象
您也可以这样做
copy_of_channel5 = channel5.dup
查看here,了解2
之间差异的详细说明排除故障*
copy_of_channel5 = channel5.clone
使用以下代码替换此行gem 'pry'
。
playlist.nodes.each {| n | binding.pry}
执行控制台暂停控制台playlist.nodes.each { |n| channel.playlist.playlist_items.create(node: n) }
中的输入后,按回车键并发布输出。