我有一个带有product_id
外键的订单模型,用户可以在单个表单上指定delivery_day
。
如果用户选择Monday
和Friday
,我希望保存两个订单的记录,其中delivery_day
属性不同product_id
。
def new
@product = Product.find(params[:product])
@day = params[:day]
@order = Order.new(:user_id => current_user.id, :product_id => @product.id, :delivery_day => @day)
end
def create
@order = Order.new(order_params)
if @order.save
redirect_to @order, notice: 'Order was successfully created.'
else
render :new
end
end
<%= form_for(@order) do |f| %>
<div class="field">
<%= f.label :user_id %><br>
<%= f.number_field :user_id %>
</div>
<div class="field">
<%= f.label :product_id %><br>
<%= f.time_select :product_id %>
</div>
<div class="field">
<%= f.label :delivery_day %><br>
<%= f.check_box :delivery_day %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我环顾四周,但找不到答案。不确定嵌套关联是否过度(例如coccoon),因为我只是尝试使用不同的order
参数创建delivery_day
的多个记录。
答案 0 :(得分:1)
使用循环
将日期名称显示为复选框<% Date::DAYNAMES.each do |day| %>
<div class="field">
<%= label_tag "<%= day %>" %><br>
<%= check_box_tag "delivary_days[]" %>
</div>
<% end %>
现在,从控制器接收选定的日期名称params[:delivary_days]
,然后相应地操作结果。
在您的控制器中:
params[:delivary_days].each do |day|
Order.create(other_parameters, :delivery_day => day)
end
我建议你去 check_box_tag 寻找必要的选项。
答案 1 :(得分:0)
将表单更新为
<%= f.label :delivery_day %><br>
<%= f.select(:delivery_day,options_for_select(Date::DAYNAMES), {multiple: true, data: {placeholder: "Select Days"}}) %>
将控制器创建操作更新为:
def create
delivery_days = order_params[:delivery_day]
delivery_days.each do |day|
@order = Order.new(order_params.merge({delivery_day: day}))
render :new unless @order.save
end
redirect_to @order, notice: 'Order was successfully
end
希望它会对你有所帮助。感谢
答案 2 :(得分:0)
您应该将表单中的checked元素作为所选元素的数组。像这样order[:delivery_day][]
。
您在表单中使用check_box
标记,这可能会导致一些问题。因为在通过check_box
标记进行更新时存在问题,您可以阅读here。
最好使用上面链接中建议的check_box_tag帮助器。
尝试更改您的check_box代码,如下所示:
<div class="field">
<%= hidden_feild_tag "order[delivery_day][]", nil %>
<%= ["mon", "tue", "wed", "thurs", "fri", "sat", "sun"].each do |day| %>
<%= check_box_tag "order[delivery_day][]", day, true_or_false_if_selected_before_add_condition %>
<%= label_tag day.capitalize %>
<% end %>
</div>
因此,您将在order[delivery_day][]
参数中选择参数。如果它包含空白,请用ruby方法删除它们。
在您的创建和更新方法中,尝试创建产品S BELOW:
order[delivery_day].each do |day|
Order.create(other_params, :delivery_day => day)
end