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

Posted

技术标签:

【中文标题】使用质量分配在rails 4中添加带有复选框的嵌套属性【英文标题】:adding nested attributes with checkboxes in rails 4 using mass assignment 【发布时间】: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

【问题讨论】:

请告诉我如何改进问题。我是新手,我不想用糟糕的问题阻塞 ***,但有时我不知道它为什么不好。我构建了一个示例应用程序,以尽可能全面地解决这个问题......这已经困扰了我一个星期。 【参考方案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>

以上是关于使用质量分配在rails 4中添加带有复选框的嵌套属性的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 Rails 的改革 gem,我如何填充 has_many :通过嵌套模型

在模型 Rails 3.2.2 中没有设置 attr_accessible 的质量分配

如何在angularjs中使用带有嵌套ng-repeat的复选框

如何在 Rails 中为带有单选按钮的帖子分配一个类别?

Rails 4:如何在 Rails 中使用 JQuery 禁用基于复选框值的文本字段

什么是 Rails 3 中的质量分配