使用质量分配在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>0x007f85457ca8b8> <0x007f85456a3a48>0x007f85456a3a48>以上是关于使用质量分配在rails 4中添加带有复选框的嵌套属性的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 Rails 的改革 gem,我如何填充 has_many :通过嵌套模型
在模型 Rails 3.2.2 中没有设置 attr_accessible 的质量分配
如何在angularjs中使用带有嵌套ng-repeat的复选框