使用质量赋值在rails 4中添加带有复选框的嵌套属性

Not*_*ere 13 checkbox ruby-on-rails nested-forms mass-assignment

错误:

param is missing or the value is empty: color
Run Code Online (Sandbox Code Playgroud)

我正在制作一个表单,我可以将嵌套属性添加到父记录,我想通过复选框添加它们.我有父模型"汽车"和儿童模型"颜色"......但我想从一些默认的"颜色"开始...所以我也有模型"Sample_Colors",它根据"Car_Models"改变.

我正在尝试使用复选框将多个"颜色"添加到关联的"汽车"...我不希望与"Sample_Colors"和"颜色"的HABTM关系,因为我需要"颜色"记录可编辑而不仅仅是一个连接表.我使用HABTM完成了这个,所以我真的不明白为什么我不能以类似的方式创建非连接表记录.

我遇到麻烦的地方是质量分配......它要么抛出上面的错误,要么找不到colors_id ......

来澄清我要做的事情:

复选框需要
1.创建一个新的"颜色"记录(@ color.new)与@car记录父项关联
2.将@ color.new记录
的"value_one"列设置为sample_color.value_one值3.设置@的"value_two"列color.new记录到sample_color.value_two值

4.创建的复选框数量= =迭代的@sample_colors.

car_model.rb

class CarModel
has_many :sample_colors, dependent: :destroy
has_many :cars, dependent: :destroy
Run Code Online (Sandbox Code Playgroud)

car.rb

class Car   
has_many :colors, dependent: :destroy
belongs_to :car_model
accepts_nested_attributes_for :colors, allow_destroy: true
Run Code Online (Sandbox Code Playgroud)

sample_color.rb

class SampleColor
belongs_to :car_model
Run Code Online (Sandbox Code Playgroud)

color.rb

class Color
belongs_to :car
accepts_nested_attributes_for :finishes, allow_destroy: true
Run Code Online (Sandbox Code Playgroud)

_form(用于添加颜色)

    <%= 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%>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

cha*_*ad_ 2

您可以尝试更换:

<% @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 %>
Run Code Online (Sandbox Code Playgroud)

使用collection_check_boxes

<%= f.collection_check_boxes(:color_ids, @sample_colors, :id, :value_one) %>
Run Code Online (Sandbox Code Playgroud)

我不完全确定这是正确的,但它应该是朝着正确方向迈出的一步。让我知道事情的后续。