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

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

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

Q&A

解決済

2回答

155閲覧

複数のformタグとhidden_fileldの値の受け取り【rails】

Java_student

総合スコア83

0グッド

0クリップ

投稿2024/11/04 20:33

編集2024/11/05 16:04

実現したいこと

決済機能で複数のプランを用意したので、決済に関するテーブルにプランそれぞれに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

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

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

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

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

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

maisumakun

2024/11/04 22:45

stripeのボタンを使っているようですが、stripe側のガイドにそのあたりの記載はありませんでしたか?
maisumakun

2024/11/05 00:29

あと、RailsサイドのTurboやTubolinksは適用していますか? (これらは、ビューにJavaScriptを直書きしたものとの相性は最悪です)
Java_student

2024/11/05 15:27 編集

Tubolinksを利用しています。 またStripeはチェックアウトというフォーム欄を使うやり方が多かったので、scriptを使いました。 すみません。 scriptタグからボタンが表示されて、クリックすると決済フォームが表示されて、そこに決済ボタンも表示されていて決済ボタンを押すとteams_controllerのcreateメソッドで処理されて、決済されるという流れです。
Java_student

2024/11/05 16:03 編集

もしかしたら単純にhiddenフォームからの受け取りが出来ていないのかもしれません。
guest

回答2

0

自己解決

解決しました。
@team.plan_type = params[:plan_type]で受け取る事が出来てしっかりとプラン別に選択して決済できるようになりました。

投稿2024/11/05 18:55

Java_student

総合スコア83

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

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

0

htmlのsubmitでは submitを囲んでいる<form> ,,,, </form> の情報のみ送られます。
複数の form のデータを送るには javascriptでデータを合成してjavascriptでリクエストする必要があります。
ですので「同じページにフォームタグが複数あるのは駄目」ではないですが一手間必要です。

しかし、、、
viewを見ると送りたい という hiddenは共に f.hidden_field :plan_number, です。
この場合 name が同じになるので片方のデータは送られません。
しかし、、、
submit になるような要素がviewに見当たらない。
viewのどの部分をclickすると送信されるのですか? そこを押すと javasript が動く
のだと思いますが clickできる要素が見当たらない。
<span>ノーマルプラン</span> <span>エキスパートプラン</span> ここ?
それで起動するJSのcodeがないとわからんですね。

後も一つ
if @team.plan_number = 1 は 常に true 扱いですから else の方には行きません
また
if @team.plan_number = 1
@team.plan_id = "price_"
else @team.plan_number = 2
@team.plan_id = "price_"
end
の else @team.plan_number = 2 は通った? elsif でないのに、。、、、
あと
if でも else でも やることは一緒 @team.plan_id = "price_" なので if で場合分けする必要なし ですが、ここはまだ未完成?

投稿2024/11/05 00:25

winterboum

総合スコア23549

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

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

maisumakun

2024/11/05 00:27

> viewのどの部分をclickすると送信されるのですか? そこを押すと javasript が動く のだと思いますが clickできる要素が見当たらない。 おそらくですが、StripeのJavaScriptで何かしら生成するものと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問