2012-08-31 81 views
6

我目前拥有建立车辆的表单。该车型最初的样子:提交表单时忽略字段

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
end 

你会注意到,有没有make_idmodel_id列;这些都不是必需的,因为一个饰边属于一个模型,而一个模型属于一个品牌,所以他们不需要存储在车辆模型中。

,问题就出现了车辆形式 - 我有一些链接选择,在那里我可以选择一个牌子,然后一个模型,再微调。当我创建一个新的车辆,下面的代码工作正常:

<%= select("", "", Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select("", "", options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

正如你会注意到,品牌和型号选择没有形式参数,因而被忽略。这工作正常,车辆正确保存。

的困难出现时,我想编辑该车辆;因为制作和模型只是假人选择链接到修剪,他们最初设置为默认值,而不是正在编辑的车辆的品牌和型号。因此,我已经更新了我的模型看起来像:

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
    has_one :model, :through => :trim 
    has_one :make, :through => :model 
end 

和更新的形式:

<%= f.select(:make, Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select(:model, options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

但是,正如所预料的,这会导致Can't mass-assign protected attributes: make, model,因为品牌和型号不attr_accessible(并且在任何情况下make和model列都不存在)。

我的问题是:有没有办法提交新的车辆形态时忽略这些字段,但还是让他们选择正确的值当车辆正在编辑?

谢谢!

编辑:每从Beerlington答案,我已经更新了我的create行动如下:

def create 
    @sale = Sale.new 
    current_ability.attributes_for(:new, Sale).each do |key, value| 
     @sale.send("#{key}=", value) 
    end 
    @sale.update_attributes(params[:sale].except("date")) 
    authorize! :create, @sale 
    if @sale.save 
     redirect_to @sale, :notice => "Successfully created sale." 
    else 
     render :action => 'new' 
    end 
end 

你会注意到,我想除“日期”在这里(也尝试:日期) - 此是用非嵌套属性进行测试。

我发现,但是,迄今为止仍然被提交 - 任何人都可以帮助使用Hash#除了完整的控制器动作?

编辑2:我已经打上Beerlington的答案是正确的,因为它回答原来的问题 - 我问一个后续的问题在这里:Excluding nested form fields in controller action with Hash#exclude before mass_assignment error is generated?

回答

12

您可以删除不需要使用Hash#except键:

@vehicle.update_attributes(params[:vehicle].except(:make, :model)) 
+0

谢谢,看起来像它会工作 - 你可以更新如何除了嵌套的属性,例如在vehicles_attributes"=>{"0"=>{"make"=>""}?谢谢! –

+0

标记为答案,因为这回答了原来的问题,并把我放在正确的轨道上。 –