質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

1688閲覧

ruby on rails 配列のデータ送信方法

tomato185

総合スコア29

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/09/12 12:29

編集2020/09/13 01:29

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

下記の通りに変更すると、うまくいきました!

(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] %> <% @cart_items.each do |cart_item|%>★重要 <%= f.fields_for :orders do |o|%> <% product = Product.find_by(id: cart_item.product_id) %> <%= o.hidden_field :product_id, value: product.id %> <%= o.hidden_field :quantity, value: cart_item.quantity %> <% end%> <% end %> <p><%= f.submit "注文確定", class: 'btn' %></p> <% 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

投稿2020/09/14 11:09

tomato185

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

product_id、quantityには数値しか入らないため、配列を登録しようとしても登録はできませんね。
配列で受け取ったproduct_id:[], quantity:[]をそれぞれ1つづつ登録する必要があります。

Active Record Nested Attributes
少し調べた感じですと
↓ このように渡しているので、

Member.create( name: 'joe', posts_attributes: [ { title: 'Foo' }, { title: 'Bar' } ] )

formから渡す内容を
↓ このようになるように作るとできるのではないでしょうか

orders_attributes: [ { product_id: 6, quantity: 1 }, { product_id: 1, quantity: 2 } ])

また、渡すパラメータなどの整合性はmodelデータやテーブル設計を見ないとわらからないので、
それらの情報は載せておいたほうがよいですね!

投稿2020/09/12 15:01

編集2020/09/12 15:06
necocoa

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomato185

2020/09/13 01:32

necocoa様 ご回答ありがとうございます。 また、調べていただいて、本当にありがとうございます。 modelデータやテーブルのカラム情報も追記させていただきました!
tomato185

2020/09/13 02:54

index.html.erbの該当部分を下記のように変え、 <%= hidden_field_tag "product_id[][product]", product.id %> <%= hidden_field_tag "quantity[][count]", cart_item.quantity %> orders_controller.rbの該当部分も下記のように変えました。 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: [:product], product_id: [:count] ]) end その結果、パラメーターは "product_id"=>[{"product"=>"6"}, {"product"=>"5"}], "quantity"=>[{"count"=>"1"}, {"count"=>"1"}] になりましたが、だめでした。 他にも、ダメ元で product_id.zip(quantity) do |x, y| {product_id: "#{x}", quantity: "#{y}"} end とやってみましたが、product_id.zip(quantity) do |x, y|でエラーとなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問