【问题标题】:adding nested attributes with checkboxes in rails 4 using mass assignment使用质量分配在rails 4中添加带有复选框的嵌套属性
【发布时间】:2015-09-04 06:08:32
【问题描述】:

错误:

param is missing or the value is empty: color

我正在制作一个表单,我可以在其中向父记​​录添加嵌套属性,并且我想通过复选框添加它们。我有父模型“汽车”和子模型“颜色”……但我想从一些默认“颜色”开始……所以我还有模型“Sample_Colors”,它会根据“Car_Models”而变化。

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

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

澄清我要做什么:

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

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

汽车模型.rb

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

汽车.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

颜色.rb

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

_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%>

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

【问题讨论】:

  • 请告诉我如何改进问题。我是新手,我不想用糟糕的问题阻塞 Stackoverflow,但有时我不知道它为什么不好。我构建了一个示例应用程序,以尽可能全面地解决这个问题......这已经困扰了我一个星期。

标签: ruby-on-rails checkbox nested-forms mass-assignment


【解决方案1】:

您可以尝试替换:

<% @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 %>

collection_check_boxes:

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

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

【讨论】:

  • 嗯...它给了我“#<0x007f85457ca8b8>
  • <0x007f85456a3a48>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多