2012-08-31 11 views
6

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?

risposta

12

È possibile rimuovere le chiavi che non sono necessari utilizzando Hash#except :

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

Grazie, sembra che funzioni: potresti aggiornarti su come escludere un attributo nidificato, ad es. fare in vehicles_attributes"=>{"0"=>{"make"=>""}? Grazie! –

+0

Contrassegnato come risposta come questo risponde alla domanda originale e mi mette sulla strada giusta. –

Problemi correlati