2012-01-13 9 views
20

私は次のモデルが/chapters/edit/idのActiveRecordのための未定義のメソッドを取得する::関係

class Book < ActiveRecord::Base 
    has_many :chapters 
end 

class Chapter < ActiveRecord::Base 
    belongs_to :book 
end 

は私が

undefined method `book' for #<ActiveRecord::Relation:0x0000010378d5d0> 

を取得している私はこのような書籍にアクセスしようとすると、

@chapter.book 
+0

'Chapter'がデータベース列' book_id'を持っていて、あなたのデータベースが 'rake db:migrate'によって正しく移行されていることを二重に確認して確認できますか? –

+0

あなたの編集コントローラメソッドを表示してください。@chapterは初期化されています。 – alony

答えて

52

@chapterは1つのチャプターオブジェクトではありません。 @chapterはこのような何かに初期化されている場合:

@chapter = Chapter.where(:id => params[:id]) 

を、あなたは(つまり、コレクションではなく、単一のオブジェクトとして扱うことができる)の関係オブジェクトを取得します。ですから、find_by_idを使用してレコードを取得、またはコレクションから最初の1を取る必要があり、この問題を解決するには

@chapter = Chapter.where(:id => params[:id]).first 

または

@chapter = Chapter.find_by_id(params[:id]) 
+0

が奇妙なので、 'where'はレコードが1つだけ返ってもコレクションを返します。それを修正した。 –

+1

@JosephLeBrech IDから単一のActiveRecordを見つける場合、通常は@chapter = Chapter.find(params [:id])を使用することができます。 –

+0

「Books」のように変更しようとしています。ユーザーが章を並べ替えることができるようにして、そのようにアクセスする必要があるため、find(params [:book_id])。chapters.where(:chapter_no => params [:chapter_no])。だから私はそれを使用しないように変更しています –

3

試してみてください。他の人のようChapter.find(params[:id]).first

3

が言った - 追加.firstメソッドはこれを解決します。 @chapterを一意のIDで呼び出すと、この問題が発生しました。 .first(または.takeをRails 4に追加する)では、1つのオブジェクトだけが返されます。

関連する問題