为Nil调用ID - 实例方法

时间:2012-07-11 16:03:55

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

我对rails很新,认为我的问题可能部分是由于我对Ruby的类的性质和范围以及它们产生的对象缺乏清晰的理解。

我收到以下错误:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

Rails.root: /Users/rmcnairn/rails/search
Application Trace | Framework Trace | Full Trace

app/models/photo.rb:17:in `scanner'
app/controllers/suppliers_controller.rb:66:in `block in update'
app/controllers/suppliers_controller.rb:65:in `update'

创建照片记录后。我想使用该新记录来引用相关记录(Fabric),并在该记录上调用实例方法(Scan)。 扫描在Fabric Class中定义。

我的记录是这样设置的 a 照片 * has_many * 结构通过 Fabric_Photos

这是我的Photo Class的快照,我试图找到这种关联并在其上调用扫描方法。

class Photo < ActiveRecord::Base

  has_many :fabrics, :through => :fabric_photos
  has_many :fabric_photos
  after_create :scanner
  accepts_nested_attributes_for :fabrics
  mount_uploader :image, ImageUploader


  def scanner
    if self.fabric == true    #fabric is a boolean column in the Photo table
      self.fabrics.first.scan
   else
    return
   end
  end
end

EDIT  我添加了相关供应商控制器代码 供应商有多种面料,面料有很多照片

   def update
     @supplier = Supplier.find(params[:id])

     respond_to do |format| # line 65
       if @supplier.update_attributes(params[:supplier])
         format.html { redirect_to suppliers_url, notice: @supplier.name.to_s + ' was updated' }
         format.json { head :no_content }
       else
         format.html { render action: "edit", notice: @supplier.name.to_s + ' was NOT updated'  }
         format.json { render json: @supplier.errors, status: :unprocessable_entity }
       end
     end
   end

您是否有可能帮助我更多地了解我正在调用的关联对象的性质以及限制,如果在另一个类中调用其上的方法有任何限制。

我认为

self.fabrics.first

返回无法调用方法.scan的东西。如果有人向我解释Active Record实际上在这里产生了什么,那将是很棒的。

非常感谢

1 个答案:

答案 0 :(得分:4)

  

调用id为nil,错误地为4 - 如果你真的想要id为nil,请使用object_id

问题是self.fabrics.first正在返回零。在底层数据库中,这意味着Rails生成的sql查询返回null。

我会查看控制器代码,或者用于创建模型的任何内容。您可能无法保存/更新相关模型以连接所有内容。另外,看看每个表和那里的记录的id,以便亲自了解是什么和不创建。

在数据库中,您应该看到,如果您运行sql代码rails生成(查看日志),那么在fabric表中您没有符合查询条件的内容。