Dwa modele - jeden formularz

Witam wszystkich,

mam mały problem ze zbudowaniem formularza rejestracji, który częściowo opiera się na modelu User (gem devise) a częściowo na innym modelu - UserDetails.
Model User ma standardowe pola tj email, password itp. zaś model UserDetails ma pola tj firstname, lastname, …
i robiąc formularz w sposób standardowy:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= f.email_field :email, :placeholder => :email %>
<%= f.password_field :password, :placeholder => :password %>
<%= f.submit “Sign up” %>
<% end %>

wszystko działa dobrze, nie mniej jednak chciałbym dodać dwa dodatkowe pola:
<%= f.text_field :firstname %>
<%= f.text_field :lastname %>

jeśli je dodam dostaje błąd:

gdyż coś takiego jak firstname nie jest znane - moje pytanie brzmi jak można to obsłużyć bez nadpisywania kontrolera gemu devise ?

  1. Zastanów się czy na pewno tego potrzebujesz. Co na tym zyskujesz?
  2. Pisz zmienne raczej z podkreśleniem niż jako zlepki, first_name jest bardziej czytelne, a trzymając się takiej konwencji możesz mieć takie psikusy jak bardzodluganazwajakiejszmiennej.
  3. To nie kwestia devise’a. Dla każdego innego modelu wyskoczyłby ten sam błąd - skąd interpreter ma wiedzieć, że to metoda innego modelu? Użyj nested_attributes, jakoś tak:

# w modelu accepts_nested_attributes_for :user_details

[code=ruby]# w widoku

= f.fields_for :user_details do |d|
= d.text_field :first_name
= d.text_field :last_name[/code]
Nie sprawdzałem kodu, jakby co patrz w dokumentację, lub pytaj.

Tutaj jest niezły przykład: http://archives.ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

Ale z tego co pamiętam, to trzeba będzie jeszcze dodać:

attr_accessible :user_details_attributes

dzieki o to mi chodziło.

Pozdrawiam