2012-01-13 31 views
20

Tôi đã các mô hình sauBắt phương pháp xác định cho ActiveRecord :: Quan hệ

class Book < ActiveRecord::Base 
    has_many :chapters 
end 

class Chapter < ActiveRecord::Base 
    belongs_to :book 
end 

trong /chapters/edit/id tôi nhận được

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

khi tôi cố gắng để truy cập vào cuốn sách như thế này

@chapter.book 
+0

Bạn có thể kiểm tra lại và xác nhận rằng 'Chương' có cột cơ sở dữ liệu' book_id' và cơ sở dữ liệu của bạn được di chuyển đúng cách thông qua 'rake db: migrate'? –

+0

vui lòng hiển thị phương pháp điều khiển chỉnh sửa của bạn, nơi @chapter được khởi tạo – alony

Trả lời

52

Có vẻ như @chapter không phải là một đối tượng Chương duy nhất. Nếu @chapter được khởi tạo như sau:

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

thì bạn sẽ có đối tượng quan hệ (có thể được coi là một bộ sưu tập chứ không phải một đối tượng). Vì vậy, để khắc phục điều này bạn cần phải lấy một kỷ lục sử dụng find_by_id, hoặc đi đầu tiên từ bộ sưu tập

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

hoặc

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

lạ, vì vậy 'where' sẽ trả về bộ sưu tập ngay cả khi chỉ có một bản ghi được trả lại. thêm 'first' đã sửa nó. –

+1

@JosephLeBrech nếu bạn đang tìm một ActiveRecord đơn từ một id, bạn thường có thể sử dụng '@chapter = Chapter.find (params [: id])' –

+0

Tôi sắp thay đổi nó sao cho nó giống như 'Books. find (params [: book_id]) chapters.where (: chapter_no => params [: chapter_no]). đầu tiên' bởi vì tôi muốn người dùng có thể sắp xếp lại các chương và họ phải được truy cập theo cách đó. Vì vậy, đó là tôi đang thay đổi nó không sử dụng tìm thấy –

3

Hãy thử: Chapter.find(params[:id]).first

3

Như những người khác đã nói - thêm phương pháp .first sẽ giải quyết vấn đề này. Tôi đã gặp phải sự cố này khi gọi một @chapter bởi ID duy nhất của nó. Thêm .first (hoặc .take trong Rails 4) sẽ đảm bảo chỉ có một đối tượng được trả về.

Các vấn đề liên quan