2012-01-13 13 views
20

Mam następujące modelePierwsze metody niezdefiniowanej dla ActiveRecord :: Relacja

class Book < ActiveRecord::Base 
    has_many :chapters 
end 

i

class Chapter < ActiveRecord::Base 
    belongs_to :book 
end 

w /chapters/edit/id uzyskać

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

podczas próby uzyskania dostępu do książki jak ta

@chapter.book 
+0

Czy możesz dwukrotnie sprawdzić i potwierdzić, że 'Rozdział' ma kolumnę bazy danych' book_id' i że twoja baza danych jest poprawnie migrowana przez 'rake db: migrate'? –

+0

proszę pokazać swoją metodę kontrolera edycji, gdzie @chapter jest zainicjowany – alony

Odpowiedz

52

Wygląda na to, że @chapter nie jest pojedynczym obiektem rozdziału. Jeśli @chapter inicjowany jest coś takiego:

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

następnie dostać obiekt relacji (które mogą być traktowane jako zbiór, ale nie pojedynczy obiekt). Tak aby to naprawić trzeba odzyskać rekord używając find_by_id lub wziąć pierwszy z kolekcji

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

lub

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

, co jest dziwne, więc 'where' zwróci kolekcję, nawet jeśli tylko jeden rekord zostanie zwrócony. dodanie "pierwszego" to naprawiło. –

+1

@JosephLeBrech, jeśli znajdujesz pojedynczą ActiveRecord od id, zazwyczaj możesz użyć '@chapter = Chapter.find (params [: id])' –

+0

Zamierzam zmienić to tak, aby robiło coś w rodzaju 'Books. find (params [: book_id]). rozdziałów (gdzie:: chapter_no => params [: chapter_no]). first' ponieważ chcę, aby użytkownik mógł zmienić kolejność rozdziałów i muszą one być dostępne w ten sposób. więc zmieniam go tak, aby nie używał funkcji find –

3

Spróbuj: Chapter.find(params[:id]).first

3

Jak mówili inni - dodawanie Metoda .first rozwiąże ten problem. Doświadczyłem tego problemu podczas dzwonienia do rozdziału @ według jego unikalnego identyfikatora. Dodanie .first (lub .take w Railsach 4) zapewni zwrot tylko jednego obiektu.

Powiązane problemy