2015-06-18 21 views
13

errore:aggiunta di attributi nidificati con caselle di controllo a rotaie 4 con assegnazione di massa

param is missing or the value is empty: color 

Sto facendo una forma in cui posso aggiungere attributi nidificati a un record di genitore e voglio aggiungere loro attraverso caselle di controllo. Ho il modello genitore "Car" e il modello figlio "Colors" ... ma voglio iniziare con alcuni "colori" predefiniti ... quindi ho anche il modello "Sample_Colors", che cambia in base a "Car_Models".

Sto cercando di aggiungere più "Colori" a un associato "Car" utilizzando le caselle di controllo ... Non voglio un rapporto HABTM con "Sample_Colors" e "Colori", come ho bisogno "Colori" record di essere modificabile e non solo una tabella di join. L'ho fatto usando HABTM e quindi non capisco perché non riesco a creare un record non-join-table in modo simile.

Dove Sto avendo difficoltà è con le assegnazioni di massa ... neanche genera l'errore sopra o non riesce a trovare il colors_id ...

per chiarire quello che sto cercando di fare:

le caselle di controllo devono
1. Creare un nuovo record "Color" (@ color.new) che è associato con il record @car genitore
2. Impostare la colonna "value_one" del record @ color.new a il valore sample_color.value_one
3. Impostare la colonna "value_two" del record @ color.new sul valore sample_color.value_two

4. La quantità di caselle di controllo create == i @sample_colors iterati.

car_model.rb

class CarModel 
has_many :sample_colors, dependent: :destroy 
has_many :cars, dependent: :destroy 

car.rb

class Car 
has_many :colors, dependent: :destroy 
belongs_to :car_model 
accepts_nested_attributes_for :colors, allow_destroy: true 

sample_color.rb

class SampleColor 
belongs_to :car_model 

color.rb

class Color 
belongs_to :car 
accepts_nested_attributes_for :finishes, allow_destroy: true 

_form (per i colori che aggiungono)

<%= form_for @car do |f| %> 

    <%= f.fields_for 'car[color_attributes][]', @color, index: nil do |f| %> 

<label class="form-label dk-aqua">Colors for <%= @car.car_name %></label><br> 
<div class="row "> 

<%= hidden_field_tag "car[color_ids][]", nil %> 
<% @sample_colors.each do |sample_color| %> 
    <%= check_box_tag "car[color_ids][]", "#{sample_color.id}" %> 
    <%= hidden_field_tag "car[color_value_ones][]", "#{sample_color.value_one}" %> 
    <%= hidden_field_tag "car[color_value_twos][]", "#{sample_color.value_two}" %> 
    <%= label_tag :value_one, "#{sample_color.value_one}" %> <br> 

<% end %> 
</div> 
<% end %> 

    <%= f.submit 'SAVE CHANGES', :class => 'btn btn-green btn-lg btn-block' %> 
    <%end%> 

cars_controller.rb

def update 
    @color = Color.new(color_params) 
    @car.color_ids = params[:car][:color_ids] || [] 
    @car.color_value_ones = params[:car][:color_value_ones] || [] 
    @car.color_value_twos = params[:car][:color_value_twos] || [] 
     respond_to do |format| 
     if @car.update(car_params) 
     format.html { redirect_to @car, notice: 'Car was successfully updated.' } 
     format.json { render :show, status: :ok, location: @car } 
     else 
     format.html { render :edit } 
     format.json { render json: @car.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def car_params 
    params.require(:car).permit(:id, :car_name, :car_model_id, colors_attributes: [:id, {:color_ids => [], :color_value_ones => [], :color_value_twos => []}, :value_one, :value_two, 
    finishes_attributes: [:id, :value_one] ] ) 
end 

def color_params 
    params.require(:color).permit(:id, {:color_ids => [], :color_value_ones => [], :color_value_twos => []}, :value_one, :value_two, 
    finishes_attributes: [:id, :value_one] ) 
end 
+0

Per favore fatemi sapere come posso migliorare una domanda. Sono newish e non voglio bloccare Stackoverflow con domande scarse, ma a volte non ne so abbastanza per sapere perché è male. Ho creato un'app campione per essere il più esauriente possibile su questa domanda ... che mi ha perseguitato per una settimana. – NothingToSeeHere

risposta

2

Si potrebbe provare a sostituire:

<% @sample_colors.each do |sample_color| %> 
    <%= check_box_tag "car[color_ids][]", "#{sample_color.id}" %> 
    <%= hidden_field_tag "car[color_value_ones][]", "#{sample_color.value_one}" %> 
    <%= hidden_field_tag "car[color_value_twos][]", "#{sample_color.value_two}" %> 
    <%= label_tag :value_one, "#{sample_color.value_one}" %> <br> 

<% end %> 

Con collection_check_boxes:

<%= f.collection_check_boxes(:color_ids, @sample_colors, :id, :value_one) %> 

Non sono del tutto sicuro che sia corretto, ma dovrebbe essere un passo nella giusta direzione. Fammi sapere come va.

+0

Hmmm ... mi dà "metodo non definito' value_two 'per # "... forse questo significa che non puoi piegare più campi nascosti in una checkbox_collection? Ho provato a usare: value_one ... puoi anche impostare più valori di colonna con una casella di controllo? – NothingToSeeHere

+0

Non sono completamente sicuro di aver capito perché farlo, ma l'ho aggiornato in modo da ottenere almeno una casella di controllo per ogni colore. :) Mi dispiace se sono denso qui, ma non dovresti essere in grado di ottenere i valori di colore dalla relazione cromatica una volta che hai aggiunto gli identificatori di colore all'oggetto auto? Di nuovo, mi dispiace per il mio fraintendimento. –

+0

... Sto cercando di fare qualcosa di strano ... Voglio avere 1 check_box per ogni iterazione 'sample_color' e controllare che la casella crei un nuovo record 'color' con: id,: value_one (quale etichetta & sample_color.value_one dice) e: value_two (cosa dice sample_color.value_two). la tabella dei colori non è un join ... Ho solo bisogno di un modo per creare color.value_one e color.value_two dai rispettivi modelli di sample_color.value uno e sample_color.value_two. – NothingToSeeHere