Rails 3我的第一个嵌套表单不起作用 - 无法批量分配受保护的属性

时间:2013-07-12 20:20:09

标签: ruby-on-rails-3 ruby-on-rails-3.2 nested-forms

我正在Rails 3.2.13创建我的第一个嵌套表单。 User正在注册,并填写emailpasswordaddress信息以及company信息..但是当用户点击提交时,错误就会显示。错误在底部。

我不确定这一行:attr_accessible :address_attributes, :company_attributes 我读它可以帮助但它没有,我在视图中有地址,但由于一对一的关系在模型中的地址,但如果我有<%= f.fields_for :**address** do |builder| %>表格没有显示。 请问我该怎么办? :-) 帖子然后发送

"companies"=>{"name"=>"Companyname"

用户模型

class User < ActiveRecord::Base
  attr_accessible ...

    has_many :orders
    belongs_to :address
    belongs_to :company

    accepts_nested_attributes_for :address, :company
    attr_accessible :address_attributes, :company_attributes

公司模式

class Company < ActiveRecord::Base
  attr_accessible ...
    has_many :users
    validates_presence_of ...
end

地址模型

class Address < ActiveRecord::Base
  attr_accessible ...
    has_many :orders, :foreign_key => 'payment_address_id'
    has_many :orders, :foreign_key => 'delivery_address_id'
    has_many :users

    validates_presence_of ...

end

new.html.erb(创建新用户)

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

  <%= f.fields_for :addresses do |builder| %>
   ...
  <% end %> 

  <%= f.fields_for :companies do |builder| %>
   ...
  <% end %> 

  <%= f.submit %>
<% end %>
点击提交

时,

错误

Can't mass-assign protected attributes: addresses, companies

修改

第一个错误:我在类用户

中进行了更改
belongs_to :address
belongs_to :company
on
has_one :address
has_one :company

并在地址和公司模式编辑

has_many :users
on
belongs_to :user

但是嵌套的表单没有显示在视图中..我尝试通过添加.build方法编辑用户控制器

 def new
   @user = User.new
   @user.company.build
   @user.address.build
 end

但即时新错误

undefined method `build' for nil:NilClass

请问我现在要做什么?

1 个答案:

答案 0 :(得分:1)

我前一天有这样的案例,这就是我用过的。

class User
  attr_accessible :name, :email, :company_attributes, :address_attributes
  has_one :company
  accepts_nested_attributes_for :company
end

和电子邮件设置:

class Company
  belongs_to :user
end

之后我可以在控制台中运行:

User.new.build_company

表格:

<%= form_for @user do |f| %>
  <%= f.fields_for :company do |builder| %>
    <%= f.text_field :name %>
  <% end %>
<% end %>

在控制器中,您只需初始化@user变量,无需执行@user.company.build@user.address.build