Rails 3 - “未定义的方法`零?”为零:NilClass“在很多很多关系中

时间:2012-01-17 17:50:38

标签: ruby-on-rails ruby-on-rails-3

我在Rails 3中遇到了多对多关系的问题。这里涉及的3个模型是:

class Device < ActiveRecord::Base
  attr_accessible :name, :protocol, :address, :status, :room_id

  belongs_to :room

  has_many :device_abilities
  has_many :abilities, :through => :device_abilities
end

class Ability < ActiveRecord::Base
  attr_accessible :name

  has_many :device_abilities
  has_many :devices, :through => :device_abilities
end

class DeviceAbility < ActiveRecord::Base

  belongs_to :device
  belongs_to :ability
end

我在种子文件中有以下内容用于测试:

device_abilities = DeviceAbility.create([
  { device_id: '1', ability_id: '1'},
  { device_id: '1', ability_id: '2'},
  { device_id: '1', ability_id: '3'},
  { device_id: '1', ability_id: '4'},
  { device_id: '1', ability_id: '5'},
  { device_id: '2', ability_id: '1'},
  { device_id: '2', ability_id: '2'},
  { device_id: '2', ability_id: '3'},
  { device_id: '2', ability_id: '4'},
  { device_id: '2', ability_id: '5'}
  ])

(实际的设备和能力也已定义,我可以正常与它们互动)。

当我尝试

时,我收到了异常错误
def show
  @device = Device.find(params[:id])
  puts @device.abilities
end

(puts用于调试;如果我将它放入变量,我也不能使用它)。错误是:

undefined method `zero?' for nil:NilClass

谁能告诉我哪里出错了?

更新

按要求,错误跟踪:

app/controllers/devices_controller.rb:13:in `puts'
app/controllers/devices_controller.rb:13:in `puts'
app/controllers/devices_controller.rb:13:in `show'

,架构是:

create_table "abilities", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
end

create_table "devices", :force => true do |t|
    t.string   "name"
    t.string   "protocol"
    t.string   "address"
    t.boolean  "status"
    t.integer  "room_id"
    t.datetime "created_at"
    t.datetime "updated_at"
end

create_table "device_abilities", :force => true do |t|
    t.integer  "device_id"
    t.integer  "ability_id"
    t.datetime "created_at"
    t.datetime "updated_at"
end

3 个答案:

答案 0 :(得分:2)

在这里回答:Rails 3.2 Uniqueness validation raises undefined method 'zero?' for nil:Nilclass

您的sum方法正在添加到Array并覆盖Rails'Enumerable#sum

  

如何解决?

     

您是否编写过名为sum的方法,可能在名为的模块中   可枚举还是数组?如果是这样,那是一个很好的起点。你可以   重命名您的方法,或者您可以尝试更改您的方法以匹配   使用以下代码替换#sum代码的Rails方法:

     

模块可枚举的def sum(identity = 0,&amp; block)       如果block_given?         地图(安培;块)的.sum(同一性)       其他         注入(:+)||身分       最终结束   (再次:从Rails 3.2 Uniqueness validation raises undefined method 'zero?' for nil:Nilclass获取)

答案 1 :(得分:1)

好的,我终于设法将其缩小到我放在我的environment.rb文件中的一段代码:

class Array
  def sum
      self.inject{|sum,x| sum + x }
  end
end

这是为了让我能够array.sum得到一个答案,这个答案一直运作良好。我非常感谢任何评论为什么这会导致这样的问题,以及是否有办法解决这个问题,因为我的代码的其他部分都依赖于这种方法。

谢谢!

答案 2 :(得分:0)

问题可能是您不使用:dependent => :destroy默认行为是将foreign_key设置为nil。因此,如果您有DeviceAbility的对象并将Device对象与Ability对象相关联,那可以,但是当您删除其中一个时,您不能再使用它了,因为已删除的对象是{ {1}}然后。并且nil没有名为nil的方法。你可以使用这个查询:

zero?

如果返回任何结果,那么你知道问题的原因是什么!