Metoda edycji tworzy nowe rekordy, a nie tylko aktualizuje istniejące

Moje pytanie brzmi: jak sprawić, aby metody edycji / aktualizacji kontrolera moich profili przestały tworzyć nowe rekordy podczas edycji strony profilu?

Mam model użytkownika i model profilu.
user has_one :profile.
profile belongs_to :user.

Moje routes.rb wygląda tak: map.resources: users,: has_one =>: profile

Gdy użytkownik mojej aplikacji utworzy użytkownika, a trafienia zostaną przesłane, zostaną przekierowani do ekranu „Utwórz profil”.

Następujący kontroler tworzy profil w taki sposób, że utworzony adres URL profilu to: localhost: 3000 / users / [user_id] / profile

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

To wszystko działa dobrze.

Problem występuje, gdy edytuję profil.

Na początku wszystko wygląda dobrze. Po przejściu do widoku „edytuj profil” adres URL jest poprawny. Na przykład, jeśli adres URL widoku „pokaż profil” to localhost: 3000 / users / 1 / profile, wówczas widok „edytuj profil” pojawia się jako: localhost: 3000 / użytkownicy / 1 / profil / edycja

Dobre.

Kiedy dokonuję zmiany i klikam przycisk aktualizacji, wydaje się, że również działa. Zostałem przekierowany do prawidłowego widoku „Pokaż profil” i otrzymałem powiadomienie flash potwierdzające zmianę.

Oto dziwna część. Kiedy wracam do indeksu profili, aby wyświetlić wszystkie profile w aplikacji, okazuje się, że aplikacja utworzyła nowy rekord profilu za każdym razem, gdy aktualizuję profil. Oryginalny rekord profilu nadal istnieje, ale są nowe dodatkowe rekordy. Pamiętaj, że wszystkie profile w mojej aplikacji są powiązane z użytkownikiem, a użytkownik może mieć tylko jeden profil. Jeśli w mojej aplikacji jest 5 użytkowników, teraz może być 10 różnych profili, z których każdy ma adres URL, który prowadzi do zbitej strony, ponieważ id_użytkownika nie istnieje w bazie danych. Na przykład localhost: 3000 / użytkowników / 7 / profil, użytkownicy / 8 / profil itd.

Rekord zostaje zapisany w tabeli profilu w mojej bazie danych, ale kolumna user_id pokazuje NUL.

Uważam, że problem pochodzi z (a) metod edycji / aktualizacji w kontrolerze profili lub (b) kodu, którego używam do wyświetlania profili na stronie indeksu profilu.

Oto mój kontroler profilu dla metod edycji i aktualizacji:

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

koniec

Oto profil widoku pliku index.html.erb:

<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 -%>

Aby powtórzyć moje pytanie: Jak sprawić, aby metody edycji / aktualizacji kontrolera moich profili przestały tworzyć nowe rekordy podczas edycji strony profilu?

AKTUALIZACJA

Patrząc na dziennik, wygląda na to, że wywołuje metodę Edit, ale następnie wywołuje metodę „create” zamiast metody „update”, aby wykonać akcję. Oto co otrzymuję:

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]  
AKTUALIZACJA

Myślę, że to jest odpowiednia część, ale daj mi znać, jeśli potrzebujesz więcej. Reszta to tylko poszczególne pola.

<% @profile.posts.build if @profile.posts.empty? %>  
<% form_for :profile, @profile, :url => { :controller => 'profiles', :action => 'update' } do |profile_form| %>  
<%= profile_form.error_messages %>

questionAnswers(5)

yourAnswerToTheQuestion