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