Attualmente ho un modulo che crea un veicolo. Il modello del veicolo si presenta inizialmente come:Ignora i campi quando si invia il modulo
class Vehicle < ActiveRecord::Base
attr_accessible :trim_id
belongs_to :trim
end
Noterete che non ci sono make_id
o model_id
colonne; questi non sono necessari, poiché un trim appartiene a un modello e un modello appartiene a una marca, quindi non è necessario che siano memorizzati nel modello del veicolo.
Il problema si presenta sulla forma del veicolo - Ho alcune selezioni collegate, dove posso selezionare una marca, poi un modello, poi un assetto. Quando sto creando un nuovo veicolo, il seguente codice funziona bene:
<%= 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'} %>
Come potrete notare, la marca e il modello seleziona non hanno parametri di forma e, quindi, vengono ignorati. Funziona bene e il veicolo viene salvato correttamente.
La difficoltà sorge quando voglio modificare questo veicolo; poiché la marca e il modello si limitano a selezionare fittamente per incatenarli, vengono inizialmente impostati sul valore predefinito, non sulla marca e sul modello del veicolo che si sta modificando. Come risultato ho aggiornato il mio modello per assomigliare:
class Vehicle < ActiveRecord::Base
attr_accessible :trim_id
belongs_to :trim
has_one :model, :through => :trim
has_one :make, :through => :model
end
e aggiornato il modulo per:
<%= 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'} %>
Ma, come ci si sarebbe aspettato, questo si traduce in Can't mass-assign protected attributes: make, model
, dal momento che marca e modello non sono attr_accessible (e in ogni caso le colonne make e model non esistono).
La mia domanda è questa: c'è un modo per ignorare questi campi quando si invia un nuovo modulo veicolo, ma ancora li hanno selezionati i valori corretti quando un veicolo viene modificato?
Grazie!
EDIT: Per la risposta da Beerlington, ho aggiornato il mio create
azione come segue:
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
Noterete che sto cercando di tranne "data" qui (hanno anche cercato: data) - questo doveva testare con un attributo non annidato.
Sto trovando, tuttavia, che la data è ancora in fase di presentazione - qualcuno può assistere con l'azione del controller completo utilizzando Hash # tranne?
EDIT 2: ho segnato la risposta di Beerlington come corretta, in quanto ha risposto alla domanda originale - ho chiesto una domanda di follow-up qui: Excluding nested form fields in controller action with Hash#exclude before mass_assignment error is generated?
Grazie, sembra che funzioni: potresti aggiornarti su come escludere un attributo nidificato, ad es. fare in
vehicles_attributes"=>{"0"=>{"make"=>""}
? Grazie! –Contrassegnato come risposta come questo risponde alla domanda originale e mi mette sulla strada giusta. –