【问题标题】:Rails - Use fields_for to create multiple nested objectsRails - 使用 fields_for 创建多个嵌套对象
【发布时间】:2016-05-01 17:22:22
【问题描述】:

希望有人可以帮助解决这个问题。我有两个模型 order 和 date_order。每个订单可以有多个 date_orders,我应该可以在创建订单时创建多个 date_orders。

我该怎么做?如您所见,我的代码在创建 ONE date_order 并将其与创建的订单相关联方面运行良好。

更新:我尝试在我的订单/新文件中创建许多“构建器”。它适用于视图,并在我输入多个日期和时间时创建了一个订单。但是 fields_for 没有创建任何 date_orders。

orders_controller.rb

def new
    @order = Order.new
    @order.date_orders.build
end

def create
    @order = Order.new(order_params)
    if @order.save
        flash[:success] = "blah"
        redirect_to @order
    else
        render 'new'
    end
end

private

def order_params
    params.require(:order).permit(:user_id, :purpose, 
    date_orders_attributes: [:id, :order_date, :time_start, :time_end, :order_id])
end

order.rb

class Order < ActiveRecord::Base

     has_many :date_orders, :dependent => :destroy
     accepts_nested_attributes_for :date_orders, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
end

date_order.rb

class DateOrder < ActiveRecord::Base
    belongs_to :order
end

订单/new.html.erb

<%= form_for(@order, :html => {:multipart => true}) do |f| %>
    ## SOME QUESTIONS ##
    <%= f.fields_for :date_orders do |builder| %>
        <%= builder.label :date %>
        <%= builder.date_field :order_date %>

        <%= builder.label :starting_time %>
        <%= builder.time_field :time_start %>

        <%= builder.label :ending_time %>
        <%= builder.time_field :time_end %>

    <% end %>
<% end %>

【问题讨论】:

    标签: ruby-on-rails nested-forms form-for fields-for nested-form-for


    【解决方案1】:

    构建更多orders_dates:

    class OrdersController < ApplicationController
        def new
            @order = Order.new
            5.times { @order.date_orders.build }   # < === HERE ===
        end
    
        private
    
        def order_params
            params.require(:order).permit(:user_id, :purpose, 
            #                                 |-  === HERE ===
            date_orders_attributes: [:id, :content, :order_date, :time_start, :time_end, :order_id])
        end
    end
    

    更新:

    另外,将content 添加到您的强参数白名单中。

    【讨论】:

    • 这适用于视图,但不会创建任何 date_order 对象。
    • 那是因为你有一个验证要求date_ordercontent 字段,但你没有在你的强参数中将它列入白名单。我将更新我的答案以添加该注释。
    • 非常感谢,乌兹别克斯坦。你确实解决了我的问题。现在,您对让用户创建和删除 date_orders 有什么见解吗?比如说,您单击一个链接来添加一个新链接,或者删除一个新链接。因为“5.times”是任意的,用户应该确定他们订单的日期数。
    • 您必须编写 javascript 来实现这一点。一个更简单的选择是使用nested_form gem。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多