O método de edição está criando novos registros, em vez de apenas atualizar os existentes

A minha pergunta é: Como faço para que os métodos de edição / atualização do meu controlador de perfis parem de criar novos registros quando edito uma página de perfil?

Eu tenho um modelo de usuário e modelo de perfil.
user has_one :profile.
profile belongs_to :user.

Meu routes.rb se parece com isto: map.resources: users,: has_one =>: profile

Quando um visitante do meu aplicativo cria um usuário e clica em enviar, ele é direcionado para a tela "criar perfil".

O controlador a seguir cria um perfil de forma que a URL do perfil criado seja: 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

Isso tudo funciona bem.

O problema ocorre quando edito um perfil.

No começo parece bem. Quando vou para a visualização "editar perfil", a URL está correta. Por exemplo, se a URL da visualização "show profile" for localhost: 3000 / users / 1 / profile, a visualização "editar perfil" aparecerá como: localhost: 3000 / users / 1 / profile / edit

Isso é bom.

Quando faço uma alteração e clico no botão de atualização, parece que também funciona. Sou direcionado para a visualização "perfil de exibição" correta e recebo uma notificação em flash confirmando a alteração.

Então aqui está a parte estranha. Quando volto ao meu índice de perfis para ver todos os perfis no aplicativo, acontece que o aplicativo criou um novo registro de perfil toda vez que eu atualizo o perfil. O registro do perfil original ainda está lá, mas há novos registros adicionais. Lembre-se de que todos os perfis no meu aplicativo estão vinculados a um usuário, e o usuário pode ter apenas um perfil. Então, se houver 5 usuários no meu aplicativo, agora pode haver 10 perfis diferentes, cada um com uma URL que leva a uma página perdida porque o user_id não existe no banco de dados. Por exemplo, localhost: 3000 / users / 7 / profile, users / 8 / profile, etc.

O registro é salvo na tabela de perfis no meu banco de dados, mas a coluna user_id mostra um NUL.

Eu acho que o problema está vindo de (a) os métodos de edição / atualização no controlador de perfis, ou (b) o código que estou usando para exibir os perfis na minha página de índice de perfil.

Aqui está o meu controlador de perfil para os métodos de edição e atualização:

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

fim

Aqui está o arquivo de visualização index.html.erb do perfil:

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

Para repetir minha pergunta: Como faço para que os métodos de edição / atualização do meu controlador de perfis parem de criar novos registros quando edito uma página de perfil?

ATUALIZAR

Olhando para o log, parece que ele está chamando o método Edit, mas chamando o método "create" em vez do método "update" para executar a ação. Aqui está o que estou recebendo:

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

Eu acho que esta é a parte relevante, mas deixe-me saber se você precisar de mais. O resto é apenas os campos individuais.

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