Undefined method `new' for nil:NilClass

Cześć
Mam taki problem otóż mam dwie tabele Site i Booked
Chodzi o to , że można zabookować jakaś powierzchnię na stronie.
Mam relacje.
Site: belongs_to :booked
Booked : has_many :sites

Link z Site index do new booked to

<%@site.each do |site|%>
<%= link_to "Booked" ,new_site_booked_path(site),class: "label label-warning"%>
<%end%>

I controller booked

  def new
@site = Site.find(params[:site_id])
@booked = @site.booked.new
  end

Niestety wysypuje mi błąd
undefined method `new’ for nil:NilClass

@booked = @site.booked.new

Macie może jakieś pomysły? Już dłuższy czas dzisiaj z tym tematem siedze i niestety…

W widoku nie musisz iterować @site, bo z tego co widzę do niej przypisujesz jedną konkretną stronę - obiekt, nie kilka (Find w przeciwieństwie do Where zwraca jeden wynik, nie tablicę).

Nila dostajesz, bo po prostu nie istenieje obiekt, o podanych parametrach, nie znajduje go i zwraca nila.

Polecam gem ‘pry-byebug’ lub jeśli są to Railsy 4.2.0, gem’a byebug.
W metodzie new zrób coś takiego:

def new
   @site = tutaj przypisanie
   byebug (albo binding.pry)
   ...
end

W terminalu, w karcie, której masz odpalony serwer odpali się debugger, będziesz mógł sprawdzić każdą zmienna, co pod nimi jest przypisane.

czy oprócz tego że masz w tych modelach belongs_to i has_many to na poziomie bazy masz referencję do booked dla tabeli sites (czyli czy jest kolumna booked_id w tabeli sites)? Sprawdź sobie w schema.rb

Jeśli nie masz to musisz sobie przemigrować bazę, np wykonując migrację
add_reference :comments, :game, index: true,
wtedy gdy dla jakiegoś obiektu Booked utworzysz Site, to w tym w bazie danych (tabela sites) nowy rekord będzie miał wypelniony booked_id.

I taka uwaga na koniec, dla @site.booked.new, część @site.booked zwróci Ci obiekt Booked, już konkretną instancję i nie musisz na niej wywoływać new

<%=form_for [@site,@booked] do |f|%>

Dostaje błąd First argument in form cannot contain nil or be empty
Oczywiście przy wcześniej poprawionych błędach .

Zapewne side has_one booked. Skoro nie jest przypisany nie możesz na nim wywołać metody :new. spróbuj zamiast tego

@booker = @site.build_booked

OK teraz
undefined method `site_bookeds_path’ for #<#Class:0x00000005c06688:0x000000049d7868>

w widoku new /sites/15/booked/new

<%=form_for [@site,@booked] do |f|%>

Routing wygląda tak

  resources :sites do
     resources :booked
  end

Wydaje mi się że powinno być site_booked_path.
W przyszłości jeśli chcesz wiedzieć jakie masz route-y dostępne użyj w terminalu bundle exec rake routes

Jakkolwiek dziwnie to nie brzmi, to jednak powinno być resources :bookeds
Ale routing z kolei kłóci się trochę z kierunkiem relacji w modelach, więc w sumie radzę przemyśleć jeszcze tą kwestię.

Oprócz wspomnianego wcześniej @site.build_booked zamiast @site.booked.new (tutaj wiecej info o tym: http://guides.rubyonrails.org/association_basics.html#methods-added-by-belongs-to), może lepszą nazwą dla Booked byłoby Booking? Wtedy masz wiele bookings, a nie bookeds.