Rails - Построение записи соединения для вложенной формы - PullRequest
0 голосов
/ 06 мая 2018

Это был первоначальный вопрос, который я задал, но думаю, что ниже добавляет немного больше деталей к сценарию: оригинальный вопрос

Я хотел бы иметь форму, которая позволяет мне постепенно добавлять записи ассоциации к объекту, которые также должны создаваться при отправке формы.

Настройка модели (- <один ко многим) </p>

Клиент -

В моем контроллере у меня есть собственный маршрут:

  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-запрос контроллеру, чтобы получить соответствующие детали для заказа после того, как пользователь выбирает из выпадающего списка продукт, количество и т. Д., Которые они хотят .

Собираюсь ли я в правильном направлении "Построения Построения" (как я его описываю) моих записей соединения для вложенной формы для объектов, которые я хотел бы, чтобы все были созданы одновременно? Как это сделать через «Rails way»?

Моя форма: добавлены 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 %>

Мой кофейный код - В данный момент это немного хакерски, так как я все еще учусь и тоже пробую что-то сделать. Я хотел бы знать, правильно ли то, что я делаю до сих пор, и, если возможно, как мне динамически создавать записи соединения?

$ ->
  $('#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 голосов
/ 07 мая 2018

Я придумала решение - однако я все еще не уверена, что это «Путь Рельсов»

Мне приходилось полагаться на зависимости / ограничения, которые есть в моем приложении

А именно: 1) клиент может сделать только один заказ за раз (также нет логина / аутентификации для ассоциированных пользователей)

Зная это и понимая, как rails создает идентификаторы и имена с помощью ассоциаций, я сейчас динамически создаю HTML, необходимый для генерации элементов таблицы соединений.

, например

<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, то идентификатор нужно будет обновить, чтобы отразить 0 и 1.

Проблемы, с которыми сталкиваются при вышеуказанном решении: Я должен изменить порядок идентификаторов элементов при их удалении - не так уж и плохо, потому что они всегда будут 0..N-1 для количества заказанных элементов.

Что я действительно хотел бы знать, так это то, что я, если можно так сказать, схожу с рельсов ... Правильно ли то, что я делаю выше? Или это вполне приемлемо? Или я просто беспокоюсь о том, чтобы сделать это «путем Rails» и просто пойду с этим - если это работает для меня?

Любой ответ высоко ценится.

...