多次保存记录不同的参数Rails

时间:2015-09-12 02:22:08

标签: ruby-on-rails ruby

我有一个带有product_id外键的订单模型,用户可以在单个表单上指定delivery_day

如果用户选择MondayFriday,我希望保存两个订单的记录,其中delivery_day属性不同product_id

控制器/ orders_controller.rb

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.html.erb

<%= 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的多个记录。

3 个答案:

答案 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