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?
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! –Marcado como respuesta ya que responde a la pregunta original y me pone en el camino correcto. –