0

我有两个模型用户和个人资料。
我想将用户名和密码保存在配置文件中的用户和其他用户配置文件详细信息中。
现在,
用户模型具有:

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])

那么,出了什么问题?我也尝试将 :profile_attributes 放在 attr_accessible 中,但它没有帮助!
请帮我找出解决方案。

4

1 回答 1

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 %>

有关更多信息,请参阅 Ryan Daigle 的这个古老但很棒的教程

于 2012-08-13T10:53:18.867 回答