0

私はレールに比較的慣れていないので、問題の一部は、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) を呼び出したいと思います。Scan は Fabric クラスで定義されます。

私の記録は、写真が*has_many* Fabrics : 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

EDIT I は、関連するサプライヤー コントローラー コードを追加しました。

   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 がここで実際に何を制作しているのかを説明してくれる人がいれば素晴らしいと思います。

どうもありがとう

4

1 に答える 1

4

nil の id と呼ばれますが、これは誤って 4 になります -- 本当に nil の id が必要な場合は、object_id を使用してください

問題は、self.fabrics.firstnil を返すことです。基礎となるデータベースでは、これは Rails によって生成された SQL クエリが null を返したことを意味します。

コントローラーのコード、またはモデルの作成に使用したものを調べます。すべてを接続するために関連モデルを保存/更新していない可能性があります。また、各テーブルとそこにあるレコードの ID を見て、作成されているものと作成されていないものを自分で確認してください。

データベースで、rails が生成する sql コードを実行すると (ログを参照)、fabrics テーブルにクエリ基準を満たすものがないことがわかります。

于 2012-07-11T16:16:05.947 に答える