2013-03-27 56 views
0

我有两个模型,CarManufacturer。这些模型很简单:Rails - 嵌套模型:不能批量分配受保护的属性

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),我得到这个错误:

Can't mass-assign protected attributes: manufacturer

我已经尽力了

accepts_nested_attributes_for :manufacturer

添加到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"=>"..."} 

谢谢

+1

你的'params [:car]'包含'制造商'属性..试试这个:'@manufacturer = Manufacturer.new(params [:car] .delete(:manufacturer)); @car = @ manufacturer.cars.build(params [:car])' – codeit 2013-03-27 16:51:55

+0

虽然@codeit是现货,但您可能需要查看'acceptersted_attributes'。 – Matt 2013-03-27 16:56:29

+0

codeit - 谢谢,但 - 如何更新'更新'行动?保存一个新项目运行良好,但在更新数据时得到相同的错误... – user984621 2013-03-27 17:24:06

回答

0

您的PARAMS [:汽车]包含制造商的属性..试试这个:

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

您还没有做这样利用has_many关系。你可以通过this

+0

非常感谢您的帮助,因为您在这里聊天! – user984621 2013-03-27 20:47:58

0

您需要添加

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

在汽车模型。不要打扰@manufacturer在汽车控制器中的保存方法,它是照顾。

你应该阅读:Active Record Nested Attributes

我希望它帮助。

2

你可以通过汽车节省制造商吗?

添加到型号:

accepts_nested_attributes_for :manufacturer 

在汽车模型添加manufacturer_attributes其他汽车之间属性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散列值在制造商模型(:name,:url等)中用attr_accessible调用白名单列出。

相关问题