hiddy0329
@hiddy0329 (hiddy)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

任意の数だけフォームを表示する方法が分かりません。

解決したいこと

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

No Answers yet.

Your answer might help someone💌