Edit-Methode ist die Schaffung neuer Datensätze, anstatt nur die Aktualisierung bestehender

Meine Frage ist: Wie mache ich die edit/update-Methoden für meine profile controller stoppen, erstellen neue Datensätze, wenn ich Bearbeiten-Profil-Seite?

Habe ich ein Benutzer-Modell und Profil-Modell.

user has_one :profile.

profile belongs_to :user.

Meiner Wege.rb sieht so aus: Karte.Ressourcen :Benutzer :has_one => :Profil

Wenn ein Besucher meiner app erstellt ein Benutzer einen submit-richten Sie sich auf den "Profil erstellen" - Bildschirm.

Folgenden controller ein Profil erstellt, so dass das erstellte Profil-url ist die url: localhost:3000/Benutzer/[user_id]/Profil

def new  
    @profile = `current_user.build_profile`  
end

def create
  @profile = current_user.build_profile(params[:profile])
  if @profile.save
    flash[:notice] = 'Profile was successfully created.'
    redirect_to user_profile_path
  else
    flash[:notice] = 'Error.  Something went wrong.'
    render "new"
  end
end

Diesem alles Prima funktioniert.

Tritt das problem auf, wenn ich in Bearbeiten Sie ein Profil.

Zuerst die Dinge in Ordnung scheint. Wenn ich auf "Profil Bearbeiten" - Ansicht, die url ist korrekt. Zum Beispiel, wenn die url für das "Profil zeigen" - Ansicht ist localhost:3000/users/1/Profil, dann "Profil Bearbeiten" - Ansicht wird als: localhost:3000/users/1/Profil/Bearbeiten

Gut.

Wenn ich eine änderung vornehmen, und klicken Sie auf die Schaltfläche "aktualisieren", das scheint zu funktionieren, wie gut. Ich bekomme gerichtet, um die richtige "Profil anzeigen" - Ansicht, und ich bekomme eine flash-Mitteilung mit der Bestätigung der änderung.

So, hier ist der seltsame Teil. Wenn ich zurück zu meinem index der profile, um alle profile in der app, es stellt sich heraus, dass die app hat ein neues Profil erstellt Datensatz jedes mal, wenn ich ein update der Profil. Die ursprünglichen Profil-Eintrag ist immer noch da, aber es werden neue zusätzliche Datensätze. Beachten Sie, dass alle profile in meiner app sind gebunden an einen Benutzer, und der Benutzer kann nur ein Profil. Also, wenn es 5 user in meiner app gibt es jetzt vielleicht 10 verschiedene profile, die jeweils mit einer url führt zu einer Seite kaputt, da die user_id nicht in der Datenbank vorhanden. Zum Beispiel localhost:3000/users/7/- profile Benutzer/8/Profil, etc.

Den Datensatz gespeichert wird, um die Profil-Tabelle in meiner Datenbank, aber die user_id-Spalte eine NULL.

Ich vermute, dass das problem entweder (a) die edit/update-Methoden, die in die profile controller, oder (b) der code, den ich verwende, um display-profile auf mein Profil index-Seite.

Hier ist mein Profil-controller für die edit-und update-Methoden:

def edit
    @profile = current_user.profile(params[:id])
end

def update
  @profile = current_user.profile.find(params[:id])
  if @profile.update_attributes(params[:profile])
    flash[:notice] = 'Profile was successfully updated.'
    redirect_to(@profile)
  else
    render "edit"
  end

Ende

Hier ist das Profil-index.html-Code.erb Datei anzeigen:

<div id="posts">
  <% @profiles.each do |profile| -%>
    <% unless profile.blank? -%>
    <div class="profiles">
    <div class="right">
            <p><%=h profile.name %></p>
        <p><%=h profile.category %></p>
            </div>
    <div class="bottom">
            <p><%= link_to 'See Profile', user_profile_path(profile) %></p>
            </div>
    <% end -%>
</div>
<% end -%>

Wiederholen meine Frage: Wie mache ich die edit/update-Methoden für meine profile controller stoppen, erstellen neue Datensätze, wenn ich Bearbeiten-Profil-Seite?

UPDATE

Beim Blick auf das log, es sieht aus wie es ' s ruft die Edit-Methode, aber dann ruft die "create" - Methode statt der "update" - Methode, um die Aktion auszuführen. Hier ist, was ich immer bin:

Processing ProfilesController#edit (for IP at 2009-08-29 00:46:06) [GET]  
  Parameters: {"action"=>"edit", "controller"=>"profiles", "user_id"=>"1"}  
  User Load (0.3ms)   SELECT * FROM "users" WHERE ("users"."id" = 1)   
  Profile Load (0.6ms)   SELECT * FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1  
Rendering template within layouts/application  
Rendering profiles/edit  
  SQL (0.3ms)   SELECT count(*) AS count_all FROM "posts" WHERE ("posts".profile_id = 20)   
Rendered users/_login (1.2ms)  
Completed in 29ms (View: 16, DB: 1) | 200 OK 

[http://localhost/users/1/profile/edit]

Processing ProfilesController#create (for IP at 2009-08-29 00:46:21) [POST]  
  Parameters: {"commit"=>"Update", "profile"=>{"city"=>"Brooklyn", "address1"=>"Bedford Ave.", "name"=>"Place", "zip"=>"19876", "address2"=>"Apt. 4", "category"=>"Restaurant", "website"=>"http://www.whatever.com", "description"=>"Place is awesome.", "phone"=>"555-1212", "email"=>"[email protected]", "state"=>"NY"}, "action"=>"create", "authenticity_token"=>"[redacted]", "controller"=>"profiles", "user_id"=>"1"}  
  User Load (0.3ms)   SELECT * FROM "users" WHERE ("users"."id" = 1)   
  Profile Load (0.6ms)   SELECT * FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1  
  Profile Update (0.6ms)   UPDATE "profiles" SET "updated_at" = '2009-08-29 04:46:21', "user_id" = NULL WHERE "id" = 20  
  Profile Create (0.6ms)   INSERT INTO "profiles" ("name", "address1", "city", "address2", "zip", "category", "updated_at", "website", "description", "category_id", "phone", "user_id", "state", "email", "created_at") VALUES('Place', 'Bedford Ave.', 'Brooklyn', 'Apt. 4', '19876', 'Restaurant', '2009-08-29 04:46:21', 'http://www.whatever.com', 'Place is awesome.', NULL, '555-1212', 1, 'NY', '[email protected]', '2009-08-29 04:46:21')  
Redirected to http://localhost:3000/users/1/profile  
Completed in 45ms (DB: 2) | 302 Found [http://localhost/users/1/profile]  

UPDATE

Ich denke, dies ist der relevante Teil, aber lassen Sie mich wissen, wenn Sie mehr brauchen. Der rest ist einfach nur die einzelnen Felder.

<% @profile.posts.build if @profile.posts.empty? %>  
<% form_for :profile, @profile, :url => { :controller => 'profiles', :action => 'update' } do |profile_form| %>  
<%= profile_form.error_messages %>
  • Bitte auch deinen post Bearbeiten-Ansicht-code. Ich speziell bin auf der Suche nach der form-code.
  • Oben gepostet. Danke.
  • Ich sollte erklären. Ich arbeite posts hinzufügen, um das Profil, so dass ich denke, dass einige der Formular-code in der Bearbeiten-Ansicht verbunden ist, dass mit. Ich bin nach den Erste Schritte Anleitung auf der Rails-Website. Sie beraten, ändern Sie die "f" zu "form", und ich denke, dass die erste Zeile des Codes ist auch verwandt mit der. Aber ich hatte das gleiche problem, bevor ich anfing zu versuchen, um die Beiträge.
InformationsquelleAutor MikeH | 2009-08-29
Schreibe einen Kommentar