2012-01-13 31 views
20

我有以下型號獲取未定義的方法ActiveRecord的::關係

class Book < ActiveRecord::Base 
    has_many :chapters 
end 

class Chapter < ActiveRecord::Base 
    belongs_to :book 
end 

/chapters/edit/id我得到

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

當我嘗試這樣訪問本書

@chapter.book 
+0

你能仔細檢查並確認'Chapter'有一個數據庫字段'book_id'和你的數據庫是通過'耙分貝正確遷移:migrate'? – 2012-01-13 10:02:34

+0

請出示您的編輯控制方法,其中@chapter初始化 – alony 2012-01-13 10:36:23

回答

52

貌似@chapter不是一個單一的章對象。如果@chapter初始化是這樣的:

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

那麼你得到一個關係對象(可以被視爲一個集合,而不是一個單一的對象)。因此,要解決這個問題,你需要使用find_by_id檢索記錄,或採取從集合的第一個

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

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

這是奇怪的,所以'where'會返回即使只有一個返回記錄集。附加'第一個'固定它。 – 2012-01-13 11:15:13

+1

@JosephLeBrech如果你是從一個id找到一個單一的ActiveRecord,通常可以使用'@chapter = Chapter.find(PARAMS [:編號])' – 2012-01-13 12:43:56

+0

我很擔心,這樣它確實像'書籍去改變它。 find(params [:book_id])。chapters.where(:chapter_no => params [:chapter_no])。第一個是因爲我希望用戶能夠重新排序章節,並且必須以這種方式訪問​​它們。所以這是我改變了它不使用發現 – 2012-01-13 13:48:45

3

嘗試:Chapter.find(params[:id]).first

3

正如其他人所說 - 增加.first方法將解決此問題。通過它的唯一ID調用@chapter時,我遇到過這個問題。在Rails 4中添加.first(或.take)將確保只返回一個對象。

相關問題