@kstepanovdev

Как реализовать главную страницу для добавления товаров в корзину с помощью nested attributes?

Нужен совет, если сможете помочь — выручайте, а то борода.
Не могу сделать добавление в корзину через единственную кнопку. Rails 5. Суть в чём — обычно для каждого товара генерируется форма с кнопкой и, например, окошком для указания количества товаров.
Мне надо сделать, по сути, единственную форму для всего этого добра, чтобы по нажатию "Add to Cart" в корзину падали те товары, где указанное количество в окошках не ноль.
Я так понимаю, надо юзать nested_attributes, чтобы передавать массив параметров, но пока всё, что у меня получилось — это ничего. Может, кто поможет советом.
Есть три модели, по сути.
Cart
has_many :cart_items

Products
has_many :cart_items
#тут, я так понимаю, нужно это
accepts_nested_attributes_for :cart_items

CartItems
belongs_to :cart
belongs_to :product


Выходит такая форма, которая отправляет в массиве только данные последнего товара, а не всех.
<%= form_for @order_item, remote: true do |f| %> 
  <%= f.fields_for :products do |products_form| %> 
    <% @products.each do |product| %>
      <%= product.name %>
      Unit Price:<%= number_to_currency product.price %> 
      <%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %>
      <%= f.hidden_field :product_id, value: product.id %>
    <% end %>
  <% end %>
  <%= f.submit "Add to Cart", class: "btn btn-primary" %>
<% end %>


Вот такая байда. Если есть мысли и/или ссаные тряпки, то я готов :)
  • Вопрос задан
  • 285 просмотров
Решения вопроса 1
@Givandos
верстка, пыха (прощай, родная), рельсы (вы кто?)
<%= f.fields_for :products do |products_form| %>
<% @products.each do |product| %>

По сути хелпер "fields_for" уже есть метод перебора, так что тут "each" лишний.
Следовательно строка
<%= f.hidden_field :product_id, value: product.id %>

станет попроще:
<%= products_form.hidden_field :product_id %>

Вообще я бы рекомендовал что-то типа такого:

<%= form_for @order, remote: true do |f| %>
    <%= f.fields_for :order_items, @products do |product|
        <%= product.hidden_field :product_id %>
        <%= product.number_field :quantity, value: 1 %>
    <% end %>
<% end %>

Только в модели order не забудьте получить атрибуты дочерней модели - accepts_nested_attributes_for :order_items

В результате в реквесте (кстати, сам реквест должен указывать на контроллер, который будет сохранять модель order) у вас должно быть не просто {"products"=>{"quantity"=>"6", "product_id"=>"2"}}, а что-то типа
{"order_items_attributes"=>[{"quantity"=>"6", "product_id"=>"2"}, {"quantity"=>"3", "product_id"=>"5"}]}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы