Nano Hash - криптовалюты, майнинг, программирование

Как сохранить много предметов на одной форме рельсов?

Мне нужно сохранить много товаров в корзину в форме, пользователь вводит количество в одной форме, а выбранные товары отправляются в БД, но теперь сохраняют только первое введенное количество товара. Почему?

моя форма

<%= form_for @cart_item do |f| %>
<% @category.items.each do |item| %>
<%= item.name %>
<%= f.hidden_field :item_id, :value => item.id %>

<%= f.text_field :qty %>
<% end %>
<%= f.submit %>
<% end %>

И контроллер cart_items_controller.rb

class CartItemsController < ApplicationController

    before_action :set_cart, only: [:create]


    def create
        @cart_items = CartItem.create(cart_items_params)
        @cart_items.cart_id = @cart.id
        if @cart_items.save
        redirect_to :back
        else
            render root_path
        end
    end

    private

    def cart_items_params
        params.require(:cart_item).permit(:id, :qty, :item_id, :cart_id)
    end

    def set_cart
        @cart = Cart.find(session[:cart_id])
    rescue ActiveRecord::RecordNotFound
        @cart = Cart.create
        session[:cart_id] = @cart.id
    end

end
02.12.2014

Ответы:


1

Здесь есть несколько проблем. Я дам вам небольшую шишку:

<% @category.items.each do |item| %>
  <%= item.name %>
  <%= f.hidden_field :item_id, :value => item.id %>

  <%= f.text_field :qty %>
<% end %>

Для каждого CartItem это создаст ввод, подобный этому

<input name="qty">

Это проблематично, потому что будет отправлен только один (последний в DOM). Вам необходимо изучить fields_for и включить его в ваш цикл, чтобы получить уникальные имена для каждого Item в форме.

Эта же проблема проявляется в вашем контроллере

def cart_items_params
  params.require(:cart_item).permit(:id, :qty, :item_id, :cart_id)
end

Это будет поиск одного :id, :qty, :item_id и :cart_id, когда на самом деле вы хотите принять несколько полей :item_id и :qty. Вам необходимо изучить надежные параметры с вложенными ассоциациями has_many.

Наконец у вас есть это

@cart_items = CartItem.create(cart_items_params)

который попытается создать один CartItem, когда вы действительно пытаетесь создать несколько элементов и связать их обратно с Cart. Вам необходимо изучить accepts_nested_attributes_for и многое другое. обычно «рельсы формируют ассоциацию сохранения has_many». Это широко обсуждаемая тема здесь, на SO и в других местах.

02.12.2014

2

Я делаю это:

def create
        @cart_items = params[:cart_items]
        @cart_items.each do |c|
            @cart_item = CartItem.new(c)
            if @cart_item.qty.present?
                @cart_item.cart_id = @cart.id
                @cart_item.save
            end
        end

и форма

<%= form_tag cart_items_path do %>
<% @cart_items.each do |cart_item| %>
<%= fields_for "cart_items[]", cart_item do |f| %>
    <% @category.items.each do |item| %>
      <%= item.name %>
      <%= f.hidden_field :item_id, value: item.id %>
      <%= f.text_field :qty %>
    <% end %>
    <%= f.submit %>
  <% end %>
  <% end %>
<% end %>
05.12.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..