Rails - 为嵌套表单增量构建连接记录

时间:2018-05-06 12:07:25

标签: ruby-on-rails ajax dynamic model-associations jointable

这是我提出的原始问题,但下面考虑为方案添加了更多细节:original question

我希望有一个表单允许我逐步向对象添加关联记录 - 这也必须在表单提交时创建。

模型设置( - <是一对多)

客户 - < CustomerOrder - < OrderLineItem - <产品

在我的控制器中,我有一个自定义路线:

  def custom_order
    puts "custom_order called"
    @cakeTypes = CakeType.all
    @cakes = Cake.all
    @customer = Customer.new
    @customer.customer_orders.build
  end

客户一次只能提交一个订单,这就是我构建customer_orders对象的原因。我可以在order_line_items上添加一个构建器,但这是动态的,我的问题是什么。

我的表单下面有一个link_to,它有add_to_order - 这会调用一些javascript,它会向控制器发送ajax请求,以便在用户从下拉列表中选择他们想要的产品,数量等后获取订单的相关详细信息

我是否朝着正确的方向前进?#34;增量建设" (正如我所描述的那样)我的联接记录是一个嵌套形式的对象,我希望一次创建所有对象?如何通过" Rails方式"?

来做到这一点

我的表单:添加了html评论以进一步描述我尝试做的事情:

<%= form_with(model: customer, local: true, url: "/custom_order") do |form| %>

  <!-- customer form fields, name, phone, email-->
  <%= render 'customer_fields', f: form %>

  <div class="field">
    <%= form.fields_for :customer_orders do |builder| %>
      <%= builder.label :date_needed %>
      <%= builder.date_select :date_needed %>
      <br />
      <%= builder.label :comments %>
      <%= builder.text_area :comments %>

    <% end %>
  </div>

  <!-- order form -->
  <div class="field">

    <!-- We want to display to user the cake sizes available depending on the cake they select -->
    <!-- the cake and size they select should inform the cake_price_id which is a hidden field -->
    <!-- {'data-order-line-item-cake' => "#{line_item_builder.options[:child_index]}"} -->
    <%= collection_select :order_line_item, :cake_id, Cake.order(:name), :id, :name %>
    <%= grouped_collection_select :order_line_item, :cake_size_id, Cake.all, :cake_sizes, :name, :id, :name %>
    <%= label_tag :quantity %>
    <%= text_field_tag :quantity %>
    <%= link_to "Add to order", {}, id: 'add_to_order', remote: true %> <!-- , method: :post, remote: true  %> -->

    <!-- A "customer" on this page will only every create one order -->
    <!-- so each item should field should have -->
    <!--customer[customer_orders_attributes][0][date_needed] -->
    <!--customer[customer_orders_attributes][0][comments] -->
    <!--customer[customer_orders_attributes][0][total] HIDDEN!-->

    <div id="order-items">
        <% if false %>
          <%= text_field_tag "customer[customer_orders_attributes][0][order_line_items_attributes][1][customer_order_id]", "", disabled: true%>
        <% end %>
        <!-- <input type="text" name="customer[customer_orders_attributes][0][order_line_items_attributes][1][customer_order_id]" id="customer_customer_orders_attributes_0_order_line_items_attributes_1_customer_order_id" value="" disabled="disabled"> -->
        <!-- names -->
        <!--customer[customer_orders_attributes][0][order_line_items_attributes][0..N][customer_order_id] -->
        <!--customer[customer_orders_attributes][0][order_line_items_attributes][0..N][cake_price_id] -->
        <!--customer[customer_orders_attributes][0][order_line_items_attributes][0..N][quantity] -->
    </div>

  <div class="actions">
    <%= submit_tag "Submit Order" %>
  </div>
<% end %>

我的coffeescript - 由于我还在学习并且还在努力解决问题,所以此刻有点蠢蠢欲动。我想知道我到目前为止做的是否正确,如果可能的话,我该如何动态构建连接记录?

$ ->
  $('#add_to_order').click ->
    console.log("add to order!")
    myData =
      cake_id: $('#order_line_item_cake_id :selected').val()
      cake_size_id: $('#order_line_item_cake_size_id :selected').val()
      quantity: $('#quantity').val()
    $.ajax
      url: "/build_order_item"
      type: 'GET'
      dataType: 'json'
      data: (myData)
      success: (data) ->
        console.log(data)
        #$('#order-items').append("<h6>#{data.quantity} - #{data.size} of #{data.cake} - #{data.price}</h6>")
        $('#order-items').append("<input type=\"hidden\" name=\"jims_cake_price_id\" id=\"jims_cake_price_id\" value=#{data.cake_price_id}><br />")
      error: ->
        alert "Something went wrong"

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案 - 但是我仍然不确定这是否是“Rails Way”

我不得不依赖我的应用到目前为止的依赖关系/限制

即: 1)客户一次只能创建一个订单(也没有关联用户的登录/身份验证)

了解这一点,并了解rails如何通过关联构建id和名称,我现在正在动态构建生成连接表元素所需的html。

e.g。

<input type="hidden" name="customer[customer_orders_attributes][0][order_line_items_attributes][0][cake_price_id]" value="1">

(注意第一个'0'是硬编码的,因为我知道这将是第一个订单)

第二个'0'是通过javascript生成的。这是我删除元素时重新排序的索引。

即。

如果客户添加3个产品,则索引将为0,1,2 - 如果他们删除索引0,则必须更新ID以反映0和1。

上述解决方案面临的问题: 当一个元素被删除时,我必须重新排序元素的id - 不是很糟糕,因为它们对于订购的项目数量总是为0..N-1。

我真正想知道的是,如果我要“离开Rails”可以这么说......我上面做的是正确的吗?或者这完全可以接受?或者我只是担心这样做“Rails方式”并且只是依旧 - 如果它适用于我?

任何回应都非常赞赏。