2011-01-30 9 views
1

私は2つのモデルがあります:Railsの3 - #<クラスの「-errorを構築未定義のメソッド `ビルドを使用:0x10338c828

class Thread < ActiveRecord::Base 
    has_many :attachments 
end 

class Attachment < ActiveRecord::Base 
    belongs_to :thread 
end 

私は保存する前に、添付ファイルを構築したい新しいスレッドを作成します。

@thread.attachments.build(...) 

をそれはとerroringされています:私はやっているあなたは新しい保存されていない添付ファイルを作成するために@thread.attachments.buildを使用することができるはずですfailed with NoMethodError: undefined method `build' for #<Class:0x10338c828

+0

追加する必要があります。私はまずうまく動作するスレッドを構築し、その後アタッチメントを作成しようとします。 – AnApprentice

答えて

3

has_many(明示的にまたはaccepts_nested_attributes_for経由)に:autosave => trueがある場合、それらは親スレッドが保存するときに保存されます。

あなたが正しく動作する新しいレコードの保存のための関連付けに:inverse_ofを設定する必要があります。

class Thread < ActiveRecord::Base 
    has_many :attachments, :inverse_of => :thread, :autosave => true 
end 

class Attachment < ActiveRecord::Base 
    belongs_to :thread, :inverse_of => :attachments 
end 

@zeteticで述べたように:Thread Rubyのクラスで構築されていて、使用しないでくださいあなたのアプリのシステムクラスと同じ名前。

使用しないことを学ぶ言語はいくつかあります。そのような場合には、クラス名に何かを追加して、よりわかりやすい名前を付け加えてください。あなたのアプリに刺し傷をつけて、ThreadからMessageまたはMessageThreadのように名前を変更する必要があります。

何が起こっているかは、Threadがアプリケーションコードの前にロードされるコアクラスであるためです。すでにThreadクラスがメモリにあります.Railsは、初めて参照するときに開発モードでそれを探しません。 Threadが参照され、現在ロードされていない場合、thread.rbファイルを検索することによって、Railsは開発時にクラスを要求に応じてロードします。

生産モードでは、Railsは起動時にすべてのクラスをロードし、異なる基本クラス(ObjectActiveRecord::Base)はTypeErrorになります。

1

ThreadはRubyの予約語です。あなたのモデルの名前を変更することをお勧めします。

+0

いいキャッチです。私は、生産モードで 'TypeError'を期待していますが、開発モードで' app/models/thread.rb'をロードしていない可能性があります。 –

+0

コンソールに 'Class Thread zetetic

+0

'Thread'モデルは開発モードでは全くロードされていません。私はOPがシステム 'Thread'クラスに対して動作する' @thread = Thread.new'を使用していると思われます。詳細については、私の答えの補遺を参照してください。 –

関連する問題