2016-04-20 5 views
1

ich in meinem Aufträge/edit.html.erb eine Form haben, die wie folgt beginnt:Rails nicht definierte Methode 'model_name' für nil: NilClass mit verschachtelten Attributen

<%= simple_form_for [@reservation, @order] do |f| %> 

Orders Controller:

def edit 
    @reservation = Reservation.find_by_id(params[:reservation_id]) 
    @order  = Order.find_by_id(params[:id]) 
end 

Verband:

Reservation :has_one Bestellen

Routen:

resources :reservations do 
    resources :orders 
end 

Wenn mein Weg ähnelt etwas wie /reservations/10/orders/10/edit ich einen Fehler von Rails am Ende immer sagen NoMethodError in Orders#edit und undefined method 'model_name' for nil:NilClass

Wenn ich eine neue Ordnung der Form perfekt funktioniert schaffen gut, also nicht sicher, warum ich plötzlich einen Fehler bekomme, kann mir jemand mit diesem Problem helfen?

+0

Ändern Sie 'find_by_id' zu' finden' ... könnte falsch sein, aber meine Vermutung ist, dass die Zeile nicht existiert; Wenn ja, wird 'find' explodieren (richtig, da Sie in diesem Fall sowieso nicht fortfahren wollen); 'find_by_id' wird die Dinge auf 'null' setzen, was irgendwo auf dem Weg nicht-deterministisch explodiert. – GoGoCarl

+0

Das hat definitiv funktioniert, antworten Sie bitte unten, damit ich es als Lösung markieren kann! vielen Dank! Übrigens, gibt es eine Möglichkeit, dass find_by_id "explodiert", damit ich den gleichen Fehler bekomme? @GoGoCarl – ayounis90

+0

Danke. Details zu Ihrer zweiten Frage finden Sie weiter unten. 'find_by_id' wird niemals explodieren, es gibt immer 'nil' zurück, wenn der Datensatz nicht gefunden wird. Aber Sie können diesen Fall manuell behandeln. – GoGoCarl

Antwort

2

Die aktuelle Implementierung ist fehleranfällig, wenn die URL entweder eine Reservierungs-ID oder eine ungültige Bestell-ID angegeben hat. Zwei Möglichkeiten, dies zu handhaben:

Zuerst lassen Rails es für Sie tun:

def edit 
    @reservation = Reservation.find(params[:reservation_id]) 
    @order  = Order.find(params[:id]) 
end 

Dies wird einen ActiveRecord::RecordNotFound Fehler aus, die in der Produktion, sollten Nutzer auf Ihre Seite 404 führen.

Wenn Sie lieber find_by_id zu halten und diese manuell handhaben, oder von diesem Fehler in einer anderen Art und Weise zu retten, können Sie tun:

def edit 
    @reservation = Reservation.find_by_id(params[:reservation_id]) 
    @order  = Order.find_by_id(params[:id]) 

    if @reservation.nil? || @order.nil? 
    raise ActiveRecord::RecordNotFound.new # Or, do something else 
    end 
end 

Das wie oben das gleiche Ergebnis ergeben würde ... nur mehr Code.

+0

Ausgezeichnete Antwort! Danke vielmals! – ayounis90

Verwandte Themen