拥有无法大量分配受保护的属性:当存在attr_accessible时

时间:2013-05-28 07:25:12

标签: ruby-on-rails

在User.rb中

  has_one :profile, :dependent => :destroy
  has_many :prints, :dependent => :destroy
  accepts_nested_attributes_for :profile
  before_create :build_profile

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :profile_attributes

安排有问题吗?

编辑1:

错误是:“无法批量分配受保护的属性:配置文件”

编辑2:

my profile.rb model:

class Profile < ActiveRecord::Base
  attr_accessible :name, :address, :phone
  belongs_to :user

end

和我的表格:

<%= form_for("user", :url => user_registration_path) do |f| %>
  <%= f.email_field :email, :autofocus => true, :placeholder => 'E-mail Address' %>
  <%= f.password_field :password, :placeholder => 'Password' %>
  <%= f.password_field :password_confirmation, :placeholder => 'Password Confirmation' %>

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

  <%= profile_form.text_field :name, :placeholder => 'Name' %>
  <%= profile_form.text_field :address, :placeholder => 'Address' %>
  <%= profile_form.phone_field :phone, :placeholder => 'Phone (example: 0193284647)' %>

 <% end %>

 <p><%= f.submit "Sign up", :class=>'btn btn-primary' %> </p>
<% end %>

解决方案(使用@Matt答案):

  
<%= profile_form.text_field :name, :placeholder => 'Name' %>
<%= profile_form.text_field :address, :placeholder => 'Address' %>
<%= profile_form.phone_field :phone, :placeholder => 'Phone (example: 0193284647)' 
  

因此它将使用“accepts_nested_attributes_for:profile”

3 个答案:

答案 0 :(得分:0)

如果它抱怨profile而不是profile_attributes,那么您的表单可能无法正确设置。发布您的表单代码。它应该类似于以下内容:

控制器:

@user = User.new

查看:

<%= form_for @user do |form| %>
  <%= form.fields_for :profile do |fields| %>
    <%= fields.text_area :about_you %>
  <% end %>
  <%= form.submit %>
<% end %>

答案 1 :(得分:0)

您的控制器应如下所示:

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

删除钩子

before_create :build_profile
模型中的

- 您不能在创建操作中初始化配置文件,它必须在新操作中发生。

并改变你的形式:

<%= form_for("user", :url => user_registration_path) do |f| %>

到此:

<%= form_for(@user, :url => user_registration_path) do |f| %>

您的attr_accessible似乎是正确的。

答案 2 :(得分:0)

使用:profile而不是:profile_attributes。

是我的愚蠢错误

@Matt - 你是对的。 @Mattherick - 是的。模型中应省略“before_create:build_profile”。

实际上我没有使用注册控制器覆盖(用于设计)这是奇怪的,并且它工作得很好。