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!
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
Oh Entschuldigung, es ist, ich habe nur vergessen, alles hier einzutragen. Ich werde es jetzt beheben –