Depuis que j'ai implémenté la fonction de gestion des commandes dans mon application personnelle, je vais afficher la méthode de sauvegarde par lots de plusieurs enregistrements que j'ai appris à ce moment-là.
En créant cet article, j'ai beaucoup fait référence aux articles suivants. Je vous en suis vraiment reconnaissant. [Rails 5] Procédure d'enregistrement par lots des modèles [Rails 6] Enregistrez-vous collectivement en utilisant form_with 1.2. Mise en œuvre du formulaire d'enregistrement par lots

Enregistrer uniquement les produits dont la case est cochée


Modèle du produit
| Column | Type | 
|---|---|
| name | string | 
| price | integer | 
| unit | string | 
| availability | boolean | 
models/product.rb
class Product < ApplicationRecord
  with_options presence: true do
   validates :name
   validates :unit
   validates :price, numericality: {only_integer: true, greater_than_or_equal_to: 0 }
   validates :availability, inclusion: { in: [true, false] }
  end
end
Créez un répertoire de formulaires dans le répertoire models et créez un modèle ProductCollection et un modèle de base dedans.
models/form/product_collection
class Form::ProductCollection < Form::Base
  FORM_COUNT = 10 #Ici, spécifiez le nombre de formulaires d'inscription que vous souhaitez créer
  attr_accessor :products 
  def initialize(attributes = {})
    super attributes
    self.products = FORM_COUNT.times.map { Product.new() } unless self.products.present?
  end
  
  def products_attributes=(attributes)
    self.products = attributes.map { |_, v| Product.new(v) }
  end
  def save
    Product.transaction do
      self.products.map do |product|
        if product.availability #Seuls les produits pour lesquels la case est cochée ici sont enregistrés.
          product.save
        end
      end
    end
      return true
    rescue => e
      return false
  end
end
models/form/base.rb
class Form::Base
  include ActiveModel::Model
  include ActiveModel::Callbacks
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks
end
controllers/products_controller.rb
class ProductsController < ApplicationController
  
  def new
    @form = Form::ProductCollection.new
  end
  def create
    @form = Form::ProductCollection.new(product_collection_params)
    if @form.save
      redirect_to products_path, notice: "J'ai enregistré le produit"
    else
      flash.now[:alert] = "L'enregistrement du produit a échoué"
      render :new
    end
  end
  private
  
    def product_collection_params
        params.require(:form_product_collection)
        .permit(products_attributes: [:name, :price, :unit, :availability])
    end
    
end
@ form = Form :: ProductCollection.new générera une instance du modèle que vous venez de créer.
Des paramètres forts sont reçus dans products_attributes.
ruby:views/products/new.html.haml
= form_with model: @form, url: products_path, method: :post, local: true do |form|
  %table
    %thread
      %tr
        %inscription
        %nom du produit
        %e prix de vente (yen)
        %ème unité de commande
  %tbody
    = form.fields_for :products do |f|
      %tr
        %td.text-center
          = f.check_box :availability
        %td
          = f.text_field :name
        %td
          = f.text_field :price
        %td
          = f.text_field :unit
  = form.submit "Enregistrement groupé"
  = link_to "Revenir", :back
Je crée un formulaire qui peut être enregistré plusieurs fois en utilisant form_with et fields_for.
Vous pouvez maintenant tout enregistrer en même temps.
Merci pour votre visite. Si vous avez des erreurs, veuillez les signaler.
Recommended Posts