Da ich die Auftragsverwaltungsfunktion in meiner persönlichen App implementiert habe, werde ich die Methode zum Speichern mehrerer Datensätze ausgeben, die ich zu diesem Zeitpunkt gelernt habe.
Bei der Erstellung dieses Artikels habe ich stark auf die folgenden Artikel verwiesen. Ich bin dir wirklich dankbar. [Rails 5] Verfahren zur Chargenregistrierung von Modellen [Rails 6] Gemeinsam mit form_with registrieren 1.2. Implementierung des Batch-Registrierungsformulars
Nur Produkte mit aktiviertem Kontrollkästchen registrieren
Produktmodell
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
Erstellen Sie ein Formularverzeichnis im Modellverzeichnis und erstellen Sie ein ProductCollection-Modell und ein Basismodell darin.
models/form/product_collection
class Form::ProductCollection < Form::Base
FORM_COUNT = 10 #Geben Sie hier die Anzahl der Registrierungsformulare an, die Sie erstellen möchten
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 #Es werden nur die Produkte gespeichert, für die hier das Kontrollkästchen aktiviert ist.
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: "Ich habe das Produkt registriert"
else
flash.now[:alert] = "Produktregistrierung fehlgeschlagen"
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
generiert eine Instanz des soeben erstellten Modells.
Starke Parameter werden in products_attributes empfangen.
ruby:views/products/new.html.haml
= form_with model: @form, url: products_path, method: :post, local: true do |form|
%table
%thread
%tr
%Registrierung
%th Produktname
%Verkaufspreis (Yen)
%th Bestelleinheit
%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 "Massenregistrierung"
= link_to "Rückkehr", :back
Ich erstelle ein Formular, das mit form_with und fields_for mehrfach registriert werden kann.
Jetzt können Sie alles auf einmal speichern.
Danke für Ihren Besuch. Wenn Sie Fehler haben, weisen Sie bitte darauf hin.
Recommended Posts