2012-07-11 2 views
0

저는 레일에 비교적 익숙하지 않아 루비 클래스의 특성과 범위 및 생성되는 객체에 대한 명확한 이해가 부족하여 제 문제가 부분적으로 발생할 수 있다고 생각합니다. 사진 기록의 작성 후Nil 용 호출 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)를 호출하고 싶습니다. 스캔은 패브릭 클래스에서 정의됩니다.

내 기록이 설정되어 있는지 그래서 사진 * 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 방법을 가지고 수없는 무언가를 반환하는 것을 가정한다. 액티브 레코드가 실제로 제작 한 내용을 누군가가 나에게 설명해주는 것이 좋을 것입니다.

많은 감사

+0

스택 트레이스를 붙여 넣었고 그 안에 참조 된 컨트롤러가 게시되지 않았습니다 ... 항상 스택 추적에서 관련 코드를 게시하여 더 나은 답변을 얻으십시오 :) – Draiken

+0

컨트롤러 코드가 추가되었습니다! :) – RMcNairn

답변

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를보고 자신이 무엇을 만들고 있는지를 확인하십시오.

데이터베이스에서 sql 코드를 실행하면 레일스가 생성됩니다 (로그에서 찾습니다). 패브릭 테이블에서 쿼리 조건을 만족하는 항목이없는 것을 볼 수 있습니다.

+1

당신이 맞았는데 문제가 실제로 내 패브릭 컨트롤러에 앉아있는 것처럼 보였습니다. 나는 파산 될 때까지 수동으로 각 모델의 레코드 속성을 업데이트하고 저장했습니다. 매우 감사합니다! – RMcNairn

관련 문제