Как связать варианты с заказами вкл. количество вариантов? - PullRequest
0 голосов
/ 01 октября 2019

Как включить параметры товара в заказ, вкл. количества для соответствующих опций?

-> Мне неясно, как справляться с отношением «многие ко многим» между заказами и опциями продукта и связывать их все вместе в форме заказа. .

Ниже приведен код, показывающий, как мои таблицы связаны в данный момент и как я в настоящее время пытаюсь решить его в форме.

models

class Order < ApplicationRecord
  has_many :order_options, dependent: :destroy
end

class OrderOption < ApplicationRecord
  belongs_to :option
  belongs_to :order
end

class Option < ApplicationRecord
 belongs_to :product_type
 has_many :order_options, dependent: :destroy
end

class ProductType < ApplicationRecord
 has_many :options, dependent: :destroy
end

orders_controller

class OrdersController < ApplicationController

  def new
    @shop = Shop.find(params[:shop_id])
    @order = Order.new
    @orders = @shop.orders
    @order.order_products.build
    @order.order_options.build
    @product_type_list = @shop.product_types
    @order.build_order_contact
    @products = []
    @options = []

    # Display products/options for type
    if params[:product_type].present?
      @products = ProductType.find(params[:product_type]).products
      @options = ProductType.find(params[:product_type]).options
    end
    if request.xhr?
      respond_to do |format|
        format.json {
        render json: {products: @products, options: @options}
      }
    end
  end

форма заказа

<%= simple_form_for [@shop, @order] do |f|%>
 <%= f.simple_fields_for :order_products do |order_product| %>

#select product for which options are shown -->

  <%= order_product.simple_fields_for :products do |product| %>
    <%= product.input :product_type_id, collection: @product_type_list, 
        input_html:{
         value: @product_type_list.object_id,
         id: "product_type"
         }
     %>
   <% end %>

#area to display options belonging to the product 
chosen above incl. dropdown field where users 
can select a quantity. -->

<h4>Options:</h4>
 <div id="render-options">
   # Place where Javascript and Ajax can be rendered with possible options and dropdown field for quantity
 </div>

<%= f.button :submit%>

Javascript / Ajax

    <script >
  // Grab selected product_type on which options are based -->

  $(document).on("change", "#product_type", function(){
    var product_type = $(this).val();

    $.ajax({
      url: "/shops/<%= @shop.id %>/orders/new",
      method: "GET",
      dataType: "json",
      data: {product_type: product_type},
      error: function (xhr, status, error) {
        console.error('AJAX Error: ' + status + error);
      },
      success: function (response) {
        console.log(response);


      // dynamic rendered options -->
      var options = response["options"];

      $("#render-options").html("");
      $("#render-options").append("");
      for(var i=0; i< options.length; i++){
        $("#render-options").append('<option value="' + options[i]["id"] + '">' + options[i]["name"] + '</option>');
        console.log(options[i].orders)
      }
    }
  });
  });
</script>

1 Ответ

0 голосов
/ 01 октября 2019

В этом примере я собираюсь пойти с классической формой заказа, так как она менее запутана (по крайней мере, для меня).

class Order < ApplicationRecord
  has_many :line_items, dependent: :destroy
  has_many :products, through: :line_items
  accepts_nested_attributes_for :line_items
end

class LineItem
   belongs_to :order
   belongs_to :product
end

class OrdersController
  def new
     @order = Order.new
     # seed the form with 5 empty lines
     5.times { @order.line_options.new }
  end

  def create
     @order = Order.new(order_params)
     # ...
  end

  # ...
  private
  def order_params
    params.require(:order).permit( line_items_attributes: [:product_id, :quantity] )
  end
end

<%= simple_form_for [@order] do |f| %>
  <%= f.simple_fields_for :line_items do |item| %>
    <%= f.association :product %>
    <%= f.input :quantity %>
  <% end %>
<% end %>

Это в основном настройка для «классической» формы заказа, которая имитирует бумагу. В действительности это не очень полезно, если только вы не имеете дело с бедными корпоративными миньонами, которым на самом деле приходится заполнять их сверху донизу.

Для реального интернет-магазина пользователи фактически нажимают на формы из GET /products/id, которые на самом деле должны отправлять отдельные POST /orders/:order_id/line_item запросы на вложенный маршрут, чтобы "добавить товары в корзину". Сам заказ часто создается неявно.

В общем, самая большая ошибка - думать, что вы можете рассматривать размещение заказа как один единственный http-вызов, который создает весь заказ и обрабатывает его. Вместо этого вам нужно рассматривать его как набор элементарных операций, которые в конечном итоге приводят пользователя к проверке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...