Rails - 嵌套模型:无法批量分配受保护的属性

时间:2013-03-27 16:42:07

标签: ruby-on-rails ruby model associations nested-attributes

我有两个模型,CarManufacturer。这些模型非常简单:

class Car < ActiveRecord::Base
  attr_accessible :manufacturer_id, :car_name, :descr, ...
  belongs_to :manufacturer
  ...
end

class Manufacturer < ActiveRecord::Base
  attr_accessible :name, :url
  has_many :cars
  ...
end

包含输入数据表单的视图(views/cars/_form.html.haml):

= form_for @car do |f|
  .field
  = f.label :car_name
  = f.text_field :car_name
  ...
  = f.fields_for @manufacturer do |m|
    .field
    = m.label :name
    = m.text_field :name
    ...

当我发送表格以保存输入的信息时(它转到CarsController),我收到此错误:

  

无法批量分配受保护的属性:制造商

我试图添加

  

accepts_nested_attributes_for:制造商

Car模型,但它对我没有帮助......

问题出在哪里?

修改 我如何在控制器中保存数据:

@manufacturer = Manufacturer.new(params[:car][:manufacturer])
@car = @manufacturer.cars.build(params[:car])

EDIT2: 来自日志的数据:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"4vcF5NV8D91DkxpCsqCzfbf05sOYsm7ssxZvPa3+kXo=",
 "car"=>{"car_name"=>"...",
 "descr"=>"...",
 "categroy_ids"=>["2",
 "3",
 "4"],
 "manufacturer"=>{"name"=>"Company",
 "url"=>"..."}},
 "commit"=>"Save",
 "id"=>"..."}

谢谢

3 个答案:

答案 0 :(得分:2)

您可以通过汽车保存制造商吗?

添加到汽车模型:

accepts_nested_attributes_for :manufacturer

将其他Car属性中的 manufacturer_attributes 添加到Car model中的 attr_accessible 调用中:

attr_accessible :manufacturer_attributes, :car_name, :descr, ...

将其保存在您的控制器操作(标准方式)中,如下所示:

def create
  @car = Car.new(params[:car])
  if @car.save
    redirect_to @car
  else
    render :new
 end
end

确保您在 manufacturer_attributes 哈希中发送的所有内容均为白色,并在制造商型号中使用attr_accessible调用(:name,:url等)。

答案 1 :(得分:0)

您需要添加

  

attr_accessible:manufacturer_id,:car_name,:descr,:manufacturer_attributtes

在汽车模型中。不要在汽车控制器的保存方法中使用@manufacturer来处理它。

您应该阅读:Active Record Nested Attributes

我希望它有所帮助。

答案 2 :(得分:0)

你的参数[:car]包含制造商属性..试试这个:

@manufacturer = Manufacturer.new(params[:car].delete(:manufacturer)) 
@car = @manufacturer.cars.build(params[:car])

您不是通过这种方式使用has_many关系。您可以浏览this