Rails3中的嵌套模型

时间:2012-08-13 06:25:45

标签: ruby-on-rails ruby-on-rails-3 activerecord actioncontroller

我有两个模型用户和个人资料 我想在用户名中保存用户名和密码,并在个人资料中保存其他用户个人资料详细信息 现在,
用户模型具有:

has_one :profile
accepts_nested_attributes_for :profile
attr_accessible :email, :password

个人资料模型

 belongs_to :user
 attr_accessible :bio, :birthday, :color

用户控制器

 def new
    @user = User.new
    @profile = @user.build_profile
  end

  def create
    @user = User.new(params[:user])
    @profile = @user.create_profile(params[:profile])
    if @user.save
      redirect_to root_url, :notice => "user created successfully!"
    else
      render "new"
    end
  end

视图new.html.erb包含用户和个人资料的字段 但是,当我运行此Web应用程序时,它显示错误:

无法批量分配受保护的属性:个人资料

在调试时它停留在 @user = User.new(params [:user])中的create action中

那么,有什么不对?我也试过在attr_accessible中放置:profile_attributes但它没有帮助!
请帮我找出解决方案。

1 个答案:

答案 0 :(得分:1)

首先,根据@nash的建议,您应该从@profile = @user.create_profile(params[:profile])操作中删除createaccepts_nested_attributes_for会自动为您创建个人资料。

检查您的视图是否已针对嵌套属性进行了正确设置。应该不应该在params[:profile]中看到任何内容。在params[:user][:profile_attributes]中,配置文件属性需要通过嵌套模型才能正常工作。

总之,您的create操作应如下所示:

def create
  @user = User.new(params[:user])

  if @user.save
    redirect_to root_url, :notice => "user created successfully!"
  else
    render "new"
  end
end

您的表单视图(通常为_form.html.erb)应如下所示:

<%= form_for @user do |f| %>

  Email: <%= f.text_field :email %>
  Password: <%= f.password_field :password %>

  <%= f.fields_for :profile do |profile_fields| %>

    Bio: <%= profile_fields.text_field :bio %>
    Birthday: <%= profile_fields.date_select :birthday %>
    Color: <%= profile_fields.text_field :color %>

  <% end %>

  <%= f.submit "Save" %>

<% end %>

有关详细信息,请see this old but great tutorial by Ryan Daigle