Bry wieczór.
Po milionie lat lenistwa (“prokrastynacji”) znowu się wziąłem za Railsy (prawie od zera) i na dobry początek zjada mnie problem.
Mam 2 modele (courses i languages), w skrócie:
language:
has_many :courses
courses:
belongs_to :language
Courses mają (m.in) pole language_id.
Przy wyświetlaniu kursu nie ma żadnego problemu. W widoku (courses/views/show.html.erb) jest:
<%= @course.language.name %>
i bez problemu pokazuje to, czego bym oczekiwał, czyli nazwę języka.
Za to testy funkcjonalne dla courses (generowane scaffoldem, Test::Unit), które wyglądają tak:
...
setup do
@course = courses(:one)
end
...
test "should show course" do
get :show, id: @course.to_param
assert_response :success
end
(w fixturach dla :one wartość language_id = 1)
wywalają błąd:
test_should_show_course ERROR
undefined method `name' for nil:NilClass
STDERR:
Exception `ActionView::Template::Error' at /home/jaqbeu/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/active_support/whiny_nil.rb:48:in `method_missing'
Ten sam błąd pojawia się dla “should get index” (gdzie w widoku jest to samo, co w show); pozostałe testy funkcjonalne przechodzą (jednostkowe też).
Po rozpisaniu się uświadomiłem sobie, że pewnie powinienem w setup() stworzyć jakoś język, żeby w ogóle istniał i mógł mieć jakieś name, ale no właśnie: jak?
Próbowałem:
language = Language.create(id:1, name:"Ruby")
@language = Language.create(id:1, name:"Ruby")
Language.create(id:1, name:"Ruby")
(wszystko wewnątrz setup(), nie naraz ;)) ale cały czas błądzi…
Przychodzą mi do głowy jeszcze fixtury, ale też nie wiem, jak można tam coś dodać do relacji (i nawet za bardzo nie mam pomysłu, jak tego szukać :|).
Co robić, jak żyć?
Rails 3.1.3, ruby 1.9.3p0 (2011-10-30 revision 33570) na rbenv (jak widać ;)). Jeżeli pytanie zasysa, to I blame późną porę i kajam się.