2012-08-31 22 views
6

Actualmente tengo un formulario que crea un vehículo. El modelo de vehículo se ve inicialmente como:Ignorar campos al enviar el formulario

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
end 

Usted notará que no hay make_id o model_id columnas; estos no son necesarios, ya que un corte pertenece a un modelo, y un modelo pertenece a una marca, por lo que no necesitan almacenarse en el modelo del vehículo.

El problema surge en la forma del vehículo - Tengo algunas selecciones vinculadas, donde puedo seleccionar una marca, luego un modelo y luego un borde. Cuando estoy creando un nuevo vehículo, el siguiente código funciona bien:

<%= 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'} %> 

Como podrá observar, los selecciona marca y modelo no tienen parámetros de forma, y ​​por lo tanto se ignoran. Esto funciona bien, y el vehículo se guarda correctamente.

La dificultad surge cuando quiero editar este vehículo; Debido a que la marca y el modelo simplemente el maniquí selecciona encadenar al borde, inicialmente se establecen en el valor predeterminado, no en la marca y el modelo del vehículo que se está editando. Como resultado de ello he actualizado mi modelo para parecerse a:

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

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

y actualizó el formulario a:

<%= 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'} %> 

Pero, como era de esperar, esto se traduce en Can't mass-assign protected attributes: make, model, ya que la marca y el modelo no son attr_accessible (y en cualquier caso las columnas de marca y modelo no existen).

Mi pregunta es esta: ¿hay alguna forma de ignorar estos campos al enviar un formulario de vehículo nuevo, pero aún así tenerlos a seleccionar los valores correctos cuando se está editando un vehículo?

Gracias!

EDIT: Por la respuesta de Beerlington, he actualizado mi acción create de la siguiente manera:

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 

Usted notará que estoy tratando excepto "fecha" aquí (también han intentado: Fecha) - este era probar con un atributo no anidado.

Estoy descubriendo, sin embargo, que la fecha todavía se está enviando. ¿Alguien puede ayudar con la acción del controlador completo usando Hash #, excepto?

EDIT 2: He marcado la respuesta de Beerlington como correcto, ya que responde a la pregunta original - He hecho una pregunta de seguimiento aquí: Excluding nested form fields in controller action with Hash#exclude before mass_assignment error is generated?

Respuesta

12

Puede eliminar las claves que no son necesarios utilizando Hash#except :

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

Gracias, parece que va a funcionar, ¿podría actualizar cómo se exceptúa un atributo anidado, por ejemplo, hacer en vehicles_attributes"=>{"0"=>{"make"=>""}? ¡Gracias! –

+0

Marcado como respuesta ya que responde a la pregunta original y me pone en el camino correcto. –

Cuestiones relacionadas