Problem z asocjacją has_one

Witam, posiadam model User i Password. Chciałbym aby z formularza gdzie będą pola login i password_txt zrobił się wpis do modelu Password i User (wraz z id password). Poniżej kod:

Migracja User

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :login, null: false
      t.references :password, index: true, foreign_key: true, null: false

      t.timestamps null: false
    end
  end
end

Migracja Password

class CreatePasswords < ActiveRecord::Migration
  def change
    create_table :passwords do |t|
      t.string :password_txt, null: false
      t.references :user, index: true, foreign_key: true, null: false  #jeżeli to niepotrzebne to bez tego

      t.timestamps null: false
    end
  end
end

Model User

class User < ActiveRecord::Base
    has_one :password

end

Model Password

class Password < ActiveRecord::Base
    belongs_to :user
end

Widok formularza dodania usera wraz z hasłem

<%= form_for @user do |f| %>
    <table>
      <tr>
        <th><%= f.label :login %></th><td><%= f.text_field :login %></td>
      </tr>
	      
  <tr>
	  <%= f.fields_for :password do |p| %>
	    <th><%= p.label :password_txt %></th><td><%= p.text_field :password_txt %></td>
	  <% end %>
      </tr>
      
      <tr><td></td><td><%= f.submit %></td></tr>
    </table>
<% end %>

A mój problem jest taki, że za nic w świecie nie udaje mi się utworzyć usera, abym miał w tabeli users login i id password, które password jest (powinno być) razem tworzone.

Czy w ogóle da się to tak zrobić jak wymyśliłem. Czy asocjacje są poprawne?
Ten testowy projekt jest też tu: https://ide.c9.io/mariuszeu/test-password
Z góry dzięki za pomoc.

Do imienia, nazwiska, czegokolwiek innego też zrobisz osobny model? :stuck_out_tongue:

Ten formularz dotyczy tylko usera. Żeby stworzyć password musisz to albo napisać przy tworzeniu usera, albo użyć zagnieżdżonych formularzy http://guides.rubyonrails.org/form_helpers.html#building-complex-forms

Nie, to jest test, nauka tabel zagnieżdżonych. Taki przykład. Ale dzięki temu, że hasło będzie w osobnej tabeli będzie wiadomo kiedy było ostatnio zmieniane.

Już sobie poradziłem. Aby to zadziałało, w powyższym kodzie trzeba wprowadzić zmiany:

Migracja User
Usunąć z migracji referencję do Password - to nie będzie potrzebne

 t.references :password, index: true, foreign_key: true, null: false

Migracja Password
Tutaj właśnie zostaje referencja do User

Model User
To ma wyglądać tak

  has_one :password, inverse_of: :user
  accepts_nested_attributes_for :password

Model Password
Tutaj jest dobrze, nic nie zmieniałem

Kontroler Users
Akcja new

  def new
    @user = User.new
    @user.build_password
  end

Akcja create

def create
    @user = User.new(user_params)
    if @user.save!
      redirect_to users_path
    else
      render :new
    end
  end

Parametry

  def user_params
    params.require(:user).permit(:login, password_attributes: [:password_txt])
  end