自サービスに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()
を利用しています。
何が原因かわかる方、ご享受願いますと幸いです。
あなたの回答
tips
プレビュー