ruby on rails:突然失败的方法

时间:2016-10-20 15:21:51

标签: ruby-on-rails ruby

我不确定如何在不发布整个框架的情况下最好地展示我的问题。 我有一个方法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!'

每个频道都有节点和播放列表,错误产生频道也有。 我真的不明白这个错误;该方法如何失败取决于要复制的对象?

1 个答案:

答案 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

之间差异的详细说明

排除故障*

  1. 转到您的gem文件并添加此行copy_of_channel5 = channel5.clone
  2. 运行捆绑包
  3. 使用以下代码替换此行gem 'pry'

    playlist.nodes.each {| n | binding.pry}

  4. 执行控制台暂停控制台playlist.nodes.each { |n| channel.playlist.playlist_items.create(node: n) }中的输入后,按回车键并发布输出。