前提・実現したいこと
Ruby on rails 初心者です。
現在、ECサイトの構築を行っており、つまずいたのは「DBへの配列情報」の登録処理です。
cart_itemsテーブル
に入っているカート情報が2つ以上の場合、配列を使ってordersテーブル
に情報が登録される処理を作成しております。
「商品購入」ボタン押下→createアクション
でaddressesテーブル
やordrsテーブル
に商品情報などを登録(購入する商品が1つの場合であれば問題ないのですが、2つ以上になると配列を使わないといけないかなと思っております。)
という流れを構築しようと考えています。
発生している問題・エラーメッセージ
商品がテーブルに登録されない。
ログを見ると、"product_id"=>["6", "1"], "quantity"=>["1", "2"],
というように、配列で送られているところまでは実装できましたが、
テーブルにsaveする時(もしくはその一個手前:今回の場合、address_params
アクション)にSQL文が発行されないのではないかと考えております。
配列で送られてきたデータをテーブルに1つずつ(2つの商品があれば2レコード)送信する方法をどなたか教えていただけませんでしょうか。
該当のソースコード
(views/orders/index.html.erb)一部記載 <%= form_for(@address, url: orders_path) do |f|%> <%= f.hidden_field :user_id, value: current_user.id %> <%= f.hidden_field :last_name, value: session[:last_name] %> <%= f.hidden_field :first_name, value: session[:first_name] %> <%= f.hidden_field :furi_last_name, value: session[:furi_last_name] %> <%= f.hidden_field :furi_first_name, value: session[:furi_first_name] %> <%= f.hidden_field :postal_code, value: session[:postal_code] %> <%= f.hidden_field :prefecture, value: session[:prefecture] %> <%= f.hidden_field :address, value: session[:address] %> <%= f.hidden_field :store, value: session[:store] %> <%= f.hidden_field :how_to_pay, value: session[:how_to_pay] %> <%= f.fields_for :orders do |o|%> <% @cart_items.each do |cart_item|%> <% product = Product.find_by(id: cart_item.product_id) %> <%= hidden_field_tag "product_id[]", product.id %> <%= hidden_field_tag "quantity[]", cart_item.quantity %> <% end%> <% end %> <p><%= f.submit "注文確定", class: 'btn' %></p> <% end %>
(controllers/ordes_controller.rb)★一部記載 def index cart = Cart.find_by(user_id: current_user.id) @cart_items = CartItem.where(cart_id: cart.id) @product= Product.find_by(id: current_user.id) @address = Address.new @order = @address.orders.build end def create @address = Address.new(address_params) if @address.save flash[:success] = "購入が完了しました。" session.delete(:store) session.delete(:last_name) session.delete(:first_name) session.delete(:furi_last_name) session.delete(:furi_first_name) session.delete(:postal_code) session.delete(:prefecture) session.delete(:address) session.delete(:how_to_pay) CartItem.where(cart_id: current_cart).delete_all redirect_to root_path else render "index" end end private def address_params params.require(:address).permit(:user_id, :last_name, :first_name, :furi_last_name, :furi_first_name, :postal_code, :prefecture, :address, :store, :how_to_pay, orders_attributes: [ product_id:[], quantity:[] ]) end
(models/address.rb) class Address < ApplicationRecord has_many :orders accepts_nested_attributes_for :orders end addressesテーブル(カラム) id user_id last_name first_name furi_last_name furi_first_name postal_code prefecture address store how_to_pay
(models/order.rb) class Order < ApplicationRecord belongs_to :address belongs_to :product end ordersテーブル(カラム) id product_id quantity address_id
(models/product.rb)※一部記載 class Product < ApplicationRecord has_many :orders end productsテーブル(カラム) id name price count comment category
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。