2017-01-24 3 views
0

Ich habe diese Seite, wo ein Benutzer viele Haustiere haben kann. Diese Tiere sind auf ihrem Profil aufgeführt und wenn sie auf ein Haustier klicken, werden sie zu diesem Haustierprofil weitergeleitet, wo sie die Möglichkeit haben, das Haustier zu bearbeiten. Das Laden des Formulars für die Haustiere funktioniert großartig, es bekommt die richtigen Informationen für jeden, aber dann gibt es das Problem mit der Aktualisierung. Wenn Sie im Bearbeitungsformular auf "Senden" klicken, werden alle Aktualisierungen auf das erste vorhandene Haustier verschoben. Zum Beispiel, wenn die Tiere mit den IDs 2, 5 und 11, und Updates auf 5 oder 11 auf 2 sind. Ich bin mir nicht ganz sicher was los ist.Ruby on Rails Aktualisierung auf falsche ID speichern

Hier sind meine bearbeiten und Update-Aktionen für die PetsController:

#GET to /users/:user_id/pet/edit 
def edit 
    @user = User.find(params[:user_id]) 
    @pet = Pet.find_by_id(params[:id]) 
end 

#PUT to /users/:user_id/pet/ 
def update 
    #Retrieve user from database 
    @user = User.find(params[:user_id]) 
    #Retrieve user's pet 
    @pet = @user.pets.find_by(params[:id]) 
    #Mass assign edited pet attributes and save (update) 
    if @pet.update_attributes(pet_params) 
    flash[:success] = "Pet updated!" 
    #Redirect user to profile page 
    redirect_to user_path(id: params[:user_id]) 
    else 
    render action: :edit 
    Rails.logger.info(@pet.errors.messages.inspect) 
    end 
end 

ich verschiedene Wege zu finden, die Benutzer Haustier, wie

@user.pet(params[:id]) 

, die in einem Fehler von ihm geführt habe versucht, sagend, dass es ein Haustier ohne eine ID nicht finden konnte, so probierte als nächstes

@user.pet.find_by_id(params[:id]) 

Aber dieses Ergebnis ed in update_attribute nicht definiert, so nahm ich an, dass ich nicht find_by_id anyways verwenden sollte

Gibt es eine andere Möglichkeit, die ich vielleicht tun sollte? Ich denke der Fehler ist, dass die ID des Haustiers nicht korrekt übergeben wird. Wenn ja, was könnte eine Lösung dafür sein? Ich habe versucht, die ID als ein verstecktes Feld aus dem Bearbeitungsformular übergeben, aber das hat nicht funktioniert.

Hier ist, was im Terminal passiert, wenn ein Benutzer ein Haustier zu aktualisieren versucht

Processing by PetsController#update as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0tC+qRK01CMCEZWbDtJyZ4QNmXQxnaAPKT+anRKGKh5hTWekTbEHzAd+8 +YOVIWBB0/imVrMVNcpkeBR18SHNw==", "pet"=>{"color"=>"Darigan", "species"=>"Yurble", "gender"=>"Male", "level"=>"25", "hp"=>"50", "strength"=>"50", "defence"=>"50", "movement"=>"50", "uc"=>"1", "rw"=>"0", "rn"=>"0", "uft"=>"1", "ufa"=>"0", "description"=>"uiy7i77i7i", "id"=>"5", "name"=>"Fouany", "hsd"=>"150"}, "user_id"=>"5"} 
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]] 
Pet Load (0.3ms) SELECT "pets".* FROM "pets" WHERE "pets"."user_id" = ? LIMIT ? [["user_id", 5], ["LIMIT", 1]] 
(0.1ms) begin transaction 
Pet Exists (0.2ms) SELECT 1 AS one FROM "pets" WHERE "pets"."name" = ? AND ("pets"."id" != ?) LIMIT ? [["name", "Fouany"], ["id", 2], ["LIMIT", 1]] 
(0.1ms) rollback transaction 
Rendering pets/edit.html.erb within layouts/application 
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 5], ["LIMIT", 1]] 
Rendered pets/edit.html.erb within layouts/application (12.4ms) 
Profile Load (0.4ms) SELECT "profiles".* FROM "profiles" WHERE "profiles"."user_id" = ? LIMIT ? [["user_id", 5], ["LIMIT", 1]] 
{:name=>["has already been taken"], :color=>[], :species=>[], :gender=>[], :level=>[], :hp=>[], :strength=>[], :defence=>[], :movement=>[], :uc=>[], :rw=>[], :rn=>[], :uft=>[], :ufa=>[], :description=>[]} 
Completed 200 OK in 202ms (Views: 136.1ms | ActiveRecord: 5.0ms) 

Wie Sie sehen können, ID das Tier 5 bis 2 von 5 zurück geht, vielleicht irgendwo das ist zu starten Festsetzung Das Thema?

Alle Vorschläge und Ratschläge werden sehr geschätzt!

+0

Ich hoffe deinetwegen Ihre Original-Code ist richtig eingerückt. Ein Mangel an Aufmerksamkeit kann das Lesen des Codeflusses sehr erschweren, was es oft frustrierend macht, mit ihm zu arbeiten. – tadman

+0

Oh Entschuldigung, es ist, ich habe nur vergessen, alles hier einzutragen. Ich werde es jetzt beheben –

Antwort

0
@user.pets.find_by(params[:id]) 

Sollte

@user.pets.find_by(id: params[:id]) 
+1

Könnte auch sein: '@ user.pets.find (params [: id])'. – tadman

+0

Versuchte beide, @ user.pets.find_by (id: params [: id]) gab mir den Fehler "undefined Methode' update_attributes 'für nil: NilClass und @ user.pets.find (params [: id]) gab mir "ActiveRecord :: RecordNotFound in PetsController # update Konnte Haustier ohne eine ID nicht finden" –

+0

aber, wenn Sie die ID haben, ist es notwendig, '@ user' Assoziation mit Haustieren zu verwenden ?, ist nicht' Pet.find (params [: id]) "genug? –

0

sein, wenn Ihre Benutzer nur ein Haustier benötigt wird (die Route legt dies nahe), dann die Haustier-ID keinen Zugriff haben sollten. Sie können

@user = User.find(params[:user_id]) 
@pet = @user.pet 

Werfen Sie einen Blick auf diesen Kommentar im Code das Tier erhalten:

#PUT to /users/:user_id/pet/ 

Es erwähnt die user_id, aber nicht die id