2011-10-13 113 views
5

我正在爲用戶創建一個一對一的關係,稱爲user_info。 以下是工作解決方案。Rails 3:設計has_one,嵌套屬性未更新

在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 

在user_info.rb

belongs_to :user 
attr_accessible :first_name, :last_name 

在色器件/註冊/ 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 %> 

我知道我不應該包括在視圖中構建。但我不想'觸摸'設計控制器或型號。這是最簡單的方法。

+0

原來,構建線不能正常工作。應該是'<%resource.build_user_info if resource.user_info.nil? %>' –

回答

3

原來,構建線是不是在視圖中正常工作。

應該是: <% resource.build_user_info if resource.user_info.nil? %>

1

您的呼叫嘗試:autosave => trueaccepts_nested_attributes_for

+0

應該添加到'has_one:user_info,:autosave => true',而不是'accepting_nested attributes_for'。但是,這仍然不起作用。它不保存first_name。 –

+0

嗯,好吧,那麼爲什麼你不只是將信息添加到現有的用戶模型?這將是最簡單的方法。 – janders223

+2

建立一個大用戶模型不是很好的建模。通常,用戶模型包括許多次要信息,如網站,地址,關於我,愛好等等。將它放在同一模型中意味着每次您只需要拉取用戶列表或任何操作進行身份驗證時,都必須將所有內容其他。將一對一關係分爲兩個模型是很常見的做法。 –