2011-10-13 9 views
5

Tworzę relację jeden-do-jednego z użytkownikiem o nazwie user_info. Poniżej znajduje się rozwiązanie robocze.Szyny 3: Wymyślaj z has_one, Zagnieżdżone atrybuty nie są aktualizowane

W user.rb

has_one :user_info 
accepts_nested_attributes_for :user_info, :allow_destroy => true 
attr_accessible :username, :email, :password, :password_confirmation, :remember_me, :user_info_attributes 

W user_info.rb

belongs_to :user 
attr_accessible :first_name, :last_name 

W opracować/rejestracji/edit.html.erb

<% resource.build_user_info if resource.user_info.nil? %> 
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %> 
    ... 
    <%= f.fields_for :user_info do |info| %> 
     <%= info.text_field :first_name %> 

Rozumiem, że nie powinien zawierać kompilacja w widoku. Ale nie chcę "dotykać" kontrolera lub modelu. To najprostszy sposób.

+0

Okazuje się, że linia build nie działa prawidłowo. Powinien być '<% resource.build_user_info if resource.user_info.nil? %> ' –

Odpowiedz

3

Okazuje się, że linia build nie działa prawidłowo w widoku.

Powinno być: <% resource.build_user_info if resource.user_info.nil? %>

1

Spróbuj :autosave => true na wezwanie do accepts_nested_attributes_for

+0

Należy dodać do' has_one: user_info,: autosave => true' zamiast 'accepts_nested attributes_for'. Jednak to nadal nie działa. Nie zapisuje first_name. –

+0

Hmm, ok, dlaczego więc nie dodalibyście informacji do istniejącego modelu użytkownika? To byłby najprostszy sposób na zrobienie tego. – janders223

+2

Nie jest dobrym modelowaniem zrobić duży model użytkownika. Zazwyczaj model użytkownika zawiera wiele informacji wtórnych, takich jak strona internetowa, adres, o mnie, hobby, itp. Umieszczenie go w tym samym modelu oznacza, że ​​za każdym razem, gdy wystarczy wyciągnąć listę użytkowników lub dowolną operację uwierzytelniania, trzeba wyciągnąć wszystko jeszcze. Powszechną i dobrą praktyką jest dzielenie się na 2 modele z relacją jeden-do-jednego. –

Powiązane problemy