実現したいこと
決済機能で複数のプランを用意したので、決済に関するテーブルにプランそれぞれにhidden_fieldで番号を割り振って入れようとしたいのですが、2つ目のプランを決済登録しても1つ目のプランが登録されます。
viewページには2つのプランがあるため、formタグが二つあります。
どちらもcreateメソッドで処理されるような指定を行っています。
同じページにフォームタグが複数あるのは駄目なのでしょうか?
発生している問題・エラーメッセージ
複数のフォームタグからhidden_fieldで2の値を送りたいフォームタグから操作を行ったが1の値が収納されていた。
該当のソースコード
views/teams/new.html.erb
1<%= form_with model: @team, url: teams_path, local: true do |f| %> 2 <article> 3 <% if flash[:error].present? %> 4 <div id="error_explanation"> 5 <p><%= flash[:error] %></p> 6 </div> 7 <% end %> 8 9 <label class="amount"> 10 <span>ノーマルプラン</span> 11 </label> 12 </article> 13 14 <script src="https://checkout.stripe.com/checkout.js" 15 class="stripe-button" 16 data-key = "pk_test_" 17 data-description="月額支払い" 18 data-name="ノーマルプラン" 19 data-amount="500" 20 data-locale="ja" 21 data-currency="JPY" 22 data-label="支払い"> 23 </script> 24 <%= f.hidden_field :plan_number, :value => 1 %> 25<% end %> 26 27<%= form_with model: @team, url: teams_path, local: true do |f| %> 28 <article> 29 <% if flash[:error].present? %> 30 <div id="error_explanation"> 31 <p><%= flash[:error] %></p> 32 </div> 33 <% end %> 34 35 <label class="amount"> 36 <span>エキスパートプラン</span> 37 </label> 38 </article> 39 40 <script src="https://checkout.stripe.com/checkout.js" 41 class="stripe-button" 42 data-key = "pk_test_" 43 data-description="月額支払い" 44 data-name="エキスパートプラン" 45 data-amount="800" 46 data-locale="ja" 47 data-currency="JPY" 48 data-label="支払い"> 49 </script> 50 <%= f.hidden_field :plan_number, :value => 2 %> 51<% end %> 52 53<% if @team %> 54 <%= link_to "解約する",@team, method: :delete, data: { confirm: "解約しますがいいですか?"}%> 55 <p>登録日が月末付近の場合ご注意ください</p> 56<% end %>
teams_controllers
1def new 2 @user = current_user 3 @team = Team.find_by(user_id: @user.id) 4 end 5 6 def create 7 @team = Team.new(user_id: current_user.id) 8 customer = Stripe::Customer.create({ 9 source: params[:stripeToken], 10 }) 11 @team.plan_type = params[:plan_type] 12 if @team.plan_type == 1 13 @team.plan_id = "price_************************" 14 elsif @team.plan_type == 2 15 @team.plan_id = "price_*************************" 16 end 17 subscription = Stripe::Subscription.create({ 18 customer: customer.id, 19 items: [{price: @team.plan_id}], 20 }) 21 @team.customer_id = customer.id 22 @team.stripe_subscription_id = subscription.id 23 @team.active_until = Time.zone.at(subscription.current_period_end) 24 if @team.save 25 flash[:success] = "成功しました" 26 redirect_to root_url 27 else 28 render 'new' 29 end 30 end
試したこと
formタグをforやwithで試しましたが、特に変わりはありませんでした。
params[:plan_number]も試したのですが、変わらずplan_numberに1が代入されました。
補足情報(FW/ツールのバージョンなど)
ruby 3.2.2
rails 6
stripeのボタンを使っているようですが、stripe側のガイドにそのあたりの記載はありませんでしたか?
あと、RailsサイドのTurboやTubolinksは適用していますか?
(これらは、ビューにJavaScriptを直書きしたものとの相性は最悪です)
Tubolinksを利用しています。
またStripeはチェックアウトというフォーム欄を使うやり方が多かったので、scriptを使いました。
すみません。
scriptタグからボタンが表示されて、クリックすると決済フォームが表示されて、そこに決済ボタンも表示されていて決済ボタンを押すとteams_controllerのcreateメソッドで処理されて、決済されるという流れです。
もしかしたら単純にhiddenフォームからの受け取りが出来ていないのかもしれません。
回答2件
あなたの回答
tips
プレビュー