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

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

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

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

Ruby on Rails

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

Q&A

0回答

1174閲覧

rails pay.jpを使用したクレジットカード決済でのエラー

tomato185

総合スコア29

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2020/11/19 00:02

編集2020/11/19 23:53

###実現したいこと
pay.jpを利用したクレジットカード決済の導入です。
流れとしては以下の通りです。
[住所入力画面]→[注文確認画面(カード番号を入力するというボタンを押す)]→[クレジットカード情報入力画面(モーダルで表示され、情報を入力後、モーダルを閉じる)]→[注文確認画面(注文を完了するボタンで注文完了)]

[住所入力画面]で入力された情報はsessionに保存されており、[注文確認画面]にて表示させる。そして[注文確認画面]に存在する「注文完了する」ボタンを押下すると住所情報や注文情報等がDBに登録される。

目指しているのは、
[注文確認画面]に存在する「注文完了する」ボタン押下後、住所情報や注文情報等をDBに飛ばし、クレジットカード情報はpay.jpに飛ばす。です。

###問題点
[注文確認画面]に存在する「注文完了する」ボタンを押下すると、session情報がDBに登録されない。

###該当コード

ruby

1orders_controller.rb(該当部分のみ記載) 2 3class OrdersController < ApplicationController 4 before_action :logged_in? 5 before_action :exist?, only: [:create] 6 7 8 def create 9 @address = Address.new(address_params) 10 cart = Cart.find_by(user_id: current_user.id) 11 cart_items = CartItem.where(cart_id: cart.id) 12 if @address.save 13 cart_items.each do |item| 14 product = Product.find(item.product_id) 15 product_count = product.count 16 product_count -= item.quantity 17 product.update(count: product_count) 18 end 19 session.delete(:take) 20 session.delete(:name) 21 session.delete(:postal_code) 22 session.delete(:prefecture) 23 session.delete(:address) 24 session.delete(:how_to_pay) 25 session.delete(:comment) 26 CartItem.where(cart_id: cart.id).delete_all 27 redirect_to root_path 28 else 29 render "index" 30 end 31 end 32 33 def pay 34 prefecture = Fee.find_by(prefecture: session[:prefecture]) 35 fee = prefecture.fee 36 37 cart = Cart.find_by(user_id: current_user.id) 38 cart_items = CartItem.where(cart_id: cart.id) 39 sum = 0 40 cart_items.each do |item| 41 product = Product.find(item.product_id) 42 sum += product.price + item.quantity 43 end 44 product_fee_cost = sum + fee 45 46 Payjp.api_key = Rails.application.credentials.payjp[:PAYJP_ACCESS_KEY] 47 charge = Payjp::Charge.create( 48 amout: product_fee_cost, 49 card: params['payjp-token'], 50 currency: 'jpy' 51 ) 52 end 53 54 private 55 56 def address_params 57 params.require(:address).permit(:user_id, :comment, :how_to_pay, :take, :tel, :address, :prefecture, :postal_code, :name, :price, :fee, :total_price, orders_attributes: [ 58 :user_id, :product_id, :quantity 59 ]) 60 end 61end 62

Ruby

1orders.html.erb(該当部分のみ記載) 2 3 <section class="order"> 4 <%if session[:how_to_pay]== "クレジット払い" %> 5 <div class="other_choice"> 6 <div class="other_title">クレジット番号の入力</div> 7 <div class="other_area"> 8 <%= form_tag(action: :pay, method: :post) do %> 9 <script 10 type="text/javascript" 11 src="https://checkout.pay.jp" 12 class="payjp-button" 13 data-key="<%= Rails.application.credentials.payjp[:PAYJP_PUBLIC_KEY] %>" 14 data-partial="true" 15 data-text="カード番号を入力する" 16 data-submit-text="カード番号を登録して閉じる" 17 data-token-name="info" > 18 </script> 19 <% end %> 20 <% end %> 21 </div> 22 </div> 23 <div class="confirm_btn"> 24 <%= f.submit "注文完了する", class: 'btn_confirm' %> 25 </div> 26 </div> 27 28 <%= f.hidden_field :name, value: session[:name] %> 29 <%= f.hidden_field :postal_code, value: session[:postal_code] %> 30 <%= f.hidden_field :prefecture, value: session[:prefecture] %> 31 <%= f.hidden_field :address, value: session[:address] %> 32 <%= f.hidden_field :take, value: session[:take] %> 33 <%= f.hidden_field :tel, value: session[:tel] %> 34 <%= f.hidden_field :how_to_pay, value: session[:how_to_pay] %> 35 <%= f.hidden_field :comment, value: session[:comment] %> 36 <%= f.hidden_field :user_id, value: current_user.id %> 37 <%= f.hidden_field :price, value: @sum %> 38 <%= f.hidden_field :fee, value: @fee %> 39 <%= f.hidden_field :total_price, value: @sum+@fee %> 40 <% @cart_items.each do |cart_item|%> 41 <%= f.fields_for :orders do |o|%> 42 <% product = Product.find_by(id: cart_item.product_id) %> 43 <%= o.hidden_field :user_id, value: current_user.id %> 44 <%= o.hidden_field :product_id, value: product.id %> 45 <%= o.hidden_field :quantity, value: cart_item.quantity %> 46 <% end%> 47 <% end %> 48 <% end %> 49 </div> 50 </div> 51 </section> 52 53

###その他
現在、submitボタンを押下後、orders_controllerで定義しているストロングパラメータにて変数がないよと怒られます。(当然ですが、submitを押下後、送られてきているのは<input type="hidden" name="payjp-token" value="tokn...">の値です。)

もし仮にクレジットカード決済をなくした場合では、DBに情報が登録されており、正常に想定の動きをします。
ほかに情報が必要であればなんなりとお申し付けください。

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

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

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

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

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

m.ts10806

2020/11/19 00:44

どこまで通っているか、想定の値はきているか、デバッグされましたか?
tomato185

2020/11/19 13:08

m.ts 10806様 ご質問ありがとうございます。 現在、submitボタンを押下後、orders_controllerで定義しているストロングパラメータにて変数がないよと怒られます。(当然ですが、submitを押下後、送られてきているのは<input type="hidden" name="payjp-token" value="tokn...">の値です。) もし仮にクレジットカード決済をなくした場合では、DBに情報が登録されており、正常に想定の動きをします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問