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

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

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

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

0回答

588閲覧

RailsにおけるStripeの扱いについて。current_userがnilになってしまいます

tty007

総合スコア9

Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/08 13:32

自サービスにStripeを導入するため、viewからcharge#createアクションにこの様に飛ばしています(hamlです)。

%form#payment-form{:action => "/charge", :method => "post"} .form-row %label{:for => "card-element"} クレジット・デビットカード番号 #card-element / Stripe Element がここに入ります。 / Element のエラーを入れます。 #card-errors{:role => "alert"} %button#checkout-button お支払い :javascript var stripe = Stripe(gon.stripe_api_key); var elements = stripe.elements(); var style = { base: { iconColor: '#c4f0ff', color: '#000', fontWeight: 500, fontFamily: 'Roboto, Open Sans, Segoe UI, sans-serif', fontSize: '16px', fontSmoothing: 'antialiased' }, invalid: { iconColor: '#FFC7EE', color: '#FFC7EE', } } var card = elements.create('card', {style: style}); card.mount('#card-element'); card.addEventListener('change', function(event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } }); var form = document.getElementById('payment-form'); form.addEventListener('submit', function(event) { event.preventDefault(); stripe.createToken(card).then(function(result) { if (result.error) { var errorElement = document.getElementById('card-errors'); errorElement.textContent = result.error.message; } else { stripeTokenHandler(result.token); } }); }); function stripeTokenHandler(token) { var form = document.getElementById('payment-form'); var hiddenInput = document.createElement('input'); hiddenInput.setAttribute('type', 'hidden'); hiddenInput.setAttribute('name', 'stripeToken'); hiddenInput.setAttribute('value', token.id); form.appendChild(hiddenInput); var ids = document.createElement('input'); ids.type = 'hidden'; ids.name = 'product_ids'; ids.value = gon.product_ids; form.appendChild(ids); form.submit(); }

この時、charge#create内でcurrent_userのbusketモデルのメソッドを使いたいのですが、current_userがnilになってしまうため、busketにNoMethod Errorが出現してしまいます。

def create Stripe.api_key = ENV['STRIPE_SECRET_KEY'] token = params[:stripeToken] product_ids = params[:product_ids].split(",").map(&:to_i) # プロダクトIDから合計金額を算出する total = current_user.basket.total_price(product_ids: product_ids) Stripe::Charge.create({ amount: 222, currency: 'jpy', description: 'Example charge', source: token }) binding.pry redirect_to root_path, notice: '決済に成功しました' end

ちなみに金額を直接渡さない様に、product_idを隠しフォーム上から渡し、controller内で計算するためにbasket.total_price()を利用しています。

何が原因かわかる方、ご享受願いますと幸いです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問