2012-07-11 58 views
0

我对rails比较陌生,认为我的问题可能部分是由于我对Ruby类的性质和范围以及它们产生的对象缺乏清晰的理解。调用ID为零 - 实例方法

我收到以下错误:

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类中定义。

我的记录设置,使 一个照片 *的has_many * 面料通过Fabric_Photos

这是我的照片级的快照,我试图找到这个协会,并调用扫描方法就可以了。

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 

编辑 我已经加入了相关供应商的控制器代码 供应商have_many面料,面料有许多照片

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实际上在这里产生什么,那将会很棒。

非常感谢

+0

您粘贴了堆栈跟踪,并且其中引用的控制器未发布......始终从堆栈跟踪中发布相关代码以获取更好的答案:) – Draiken 2012-07-11 16:19:18

+0

刚刚添加了控制器代码! :) – RMcNairn 2012-07-11 17:20:45

回答

4

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

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

我会看看控制器代码,或者你用来创建模型的任何东西。您可能不会保存/更新相关模型以连接所有内容。另外,请查看每个表格和记录中的记录的ID,以查看自己正在创建和未创建的内容。

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

+1

你是正确的,它看起来好像问题实际上是坐在我的Fabric控制器中,我开始通过手动更新和保存每个模型中记录的属性直到它损坏。非常感谢! – RMcNairn 2012-07-11 20:31:23