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?
AKTUALIZACJAPatrzą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]
AKTUALIZACJAMyś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 %>