我有两个模型用户和个人资料
我想在用户名中保存用户名和密码,并在个人资料中保存其他用户个人资料详细信息
现在,
用户模型具有:
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但它没有帮助!
请帮我找出解决方案。
答案 0 :(得分:1)
首先,根据@nash的建议,您应该从@profile = @user.create_profile(params[:profile])
操作中删除create
。 accepts_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 %>