任意の数だけフォームを表示する方法が分かりません。
解決したいこと
Ruby on Railsで伝票作成アプリを実装中です。
伝票を作成する画面に遷移するときに、
ユーザーに登録する商品の数を指定させ、その分だけのフォームを表示するようにしたいと
考えています。
該当するソースコード
app/controllers/slips_controller.rb
class SlipsController < ApplicationController
before_action :authenticate_user!
def new
@slip = Slip.new
10.times do
@order = @slip.orders.new
end
end
def create
@slip = Slip.new(slip_params)
if @slip.save
redirect_to root_path
else
render :new
end
end
private
def slip_params
params.require(:slip).permit(:address_name, :shipping_date, :slip_number, :invoice_number, orders_attributes: [:order_number, :color, :count, :note, :_destroy, :id])
end
end
app/models/slip.rb
class Slip < ApplicationRecord
with_options presence: true do
validates :address_name
validates :shipping_date
validates :slip_number, length: { maximum: 11 }
end
belongs_to :user
has_many :slip_products
has_many :products, through: :slip_products
has_many :slip_clients
has_many :clients, through: :slip_clients
has_many :orders, dependent: :destroy
accepts_nested_attributes_for :orders, allow_destroy: true
end
app/models/order.rb
class Order < ApplicationRecord
with_options presence: true do
validates :order_number, length: { maximum: 11 }
validates :color
validates :count
end
belongs_to :slip
end
app/views/slips/new.html.erb
<div class="d-grid gap-5">
<h2 class="text-center bg-primary text-white">新規伝票作成</h2>
<%= form_with model: @slip, url: slips_path, method: :post do |fb| %>
<div class="container">
<div class="row">
<div class="col-md-6">
<th>【出荷先】</th>
<%= fb.collection_select :address_name, Client.select(:name).distinct, :name, :name, {include_blank: "--"}, class: "form-control" %>
</div>
<div class="col-md-6">
<th>【送り主】</th>
<p class="h2">
<%= current_user.name %>
</p>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-4">
<th>【出荷日】</th>
<%= fb.date_field :shipping_date, class: 'form-control' %>
</div>
<div class="col-md-4">
<th>【伝票番号】</th>
<%= fb.text_field :slip_number, class: 'form-control' %>
</div>
<div class="col-md-4">
<th>【送り状ナンバー】</th>
<%= fb.text_field :invoice_number, class: 'form-control' %>
</div>
</div>
</div>
<div class="container">
<table class="table">
<thead>
<tr>
<th>品番</th>
<th>色</th>
<th>数量</th>
<th>備考</th>
</tr>
</thead>
<tbody class="bulk-registration-form">
<%= fb.fields_for :orders do |f| %>
<tr class="item">
<td>
<%= f.collection_select :order_number, Product.select(:item_number).distinct, :item_number, :item_number, {include_blank: "--"}, class: "form-control" %>
</td>
<td>
<%= f.collection_select :color, Product.select(:color).distinct, :color, :color, {include_blank: "--"}, class: "form-control" %>
</td>
<td>
<%= f.text_field :count, class: 'form-control' %>
</td>
<td>
<%= f.text_field :note, class: 'form-control' %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
<div class="text-center">
<%= fb.submit '登録', class: 'btn btn-primary' %>
<%= link_to "戻る", root_path, class: 'btn btn-success' %>
</div>
<% end %>
</div>
自分で試したこと
def new
@slip = Slip.new
10.times do
@order = @slip.orders.new
end
end
こちらのコードを
def new
@slip = Slip.new
puts "登録する商品の数を入力してください"
input = gets.to_i
input.times do
@order = @slip.orders.new
end
end
と変更してみましたが、これではターミナルからの入力しかできなくなってしまうので、
なんとかビューでユーザーに数を指定させてそれに応じたフォーム数を表示したいのですが、
アドバイスいただけないでしょうか。
0