2011-10-13 36 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

建立一个大用户模型不是很好的建模。通常,用户模型包括许多次要信息,如网站,地址,关于我,爱好等等。将它放在同一模型中意味着每次您只需要拉取用户列表或任何操作进行身份验证时,都必须将所有内容其他。将一对一关系分为两个模型是很常见的做法。 –