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

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

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

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

Ruby

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

3回答

1408閲覧

[Rails]postアクションでパラメーターをURLに含めずに送信して、ビューを表示させる方法

takuan1108

総合スコア56

Ruby on Rails 5

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

Ruby

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2019/04/24 06:33

編集2019/04/24 08:20

ただいま、イベントを検索してチケットを購入できるアプリをRailsで作成しています。
ちょっと思ってたことができずに行き詰まってしまったので、、
もし良いアイディアがあれば教えていただけると嬉しいです!
###実現したいこと
イベントのチケットを購入する際に、
申し込みフォームに名前やメールを入力して送信すると、
その後、フォームで入力したデータの「確認画面」が出てきて、
そこで確定ボタンを押して初めて購入処理がされるという、よくある機能を実現したいと思っています。
##現在のコード
処理の流れは以下のような感じです。

①フォームに必要事項を入力させてpostメソッドで送信(※セキュリティの関係上getで送りたくない)

haml

1= form_with model: @guest, url: confirm_event_guest_path, method: :post, local: true do |f| 2 = f.text_field :name 3 = f.email_field :email 4= f.submit "確認画面へ進む"

②アクションでparamsを受け取ったらrenderでビューを表示

Ruby

1 def confirm 2 session[:guest] = guest_params 3 render action: "confirm" 4 end 5 6 private 7 def guest_params 8 params.require(:guest).permit(:name, :email) 9 end

③ルーティングは以下のようになっています

Ruby

1Rails.application.routes.draw do 2 root to: 'events#index' 3 resources :events do 4 resource :guest, module:"events" do 5 collection do 6 post 'confirm' 7 get 'done' 8 end 9 end 10 end 11end

※関係のない部分は一部省略して書いています。
###問題点
実は上記コードでもURLにパラメーターを含めずに送信できて、ビューも表示することができています。
しかしながら、ビューを表示した後にブラウザの更新ボタン(F5)を押すとルーティングエラーになってしまいます。
そもそもconfirmアクションはルーティングではpostになっているので、
更新ボタンを押したらgetを探しに行って「そんなルーティングないよ!」となるのはわかるのですが…。
###今のところの候補
Ajaxで非同期通信で送る?
form_withだからダメでform_forならいける?

###開発環境
ruby '2.5.1'
rails '5.2.2'

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

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

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

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

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

maisumakun

2019/04/24 06:36

では、「ビューを表示した後に更新ボタンを押」した場合、どのような動作をさせたいのでしょうか?
takuan1108

2019/04/24 07:19

ありがとうございます! 更新ボタンを押しても、ルーティングエラーにならず、 今いるページを再度表示させたいと思っています。
asm

2019/04/24 07:32

更新ボタンとは、ブラウザのいわゆるF5でしょうか? それとも、ビュー側で「更新」と名のついたボタンを表示させているのでしょうか?
takuan1108

2019/04/24 07:59

説明不足ですみません! ブラウザの更新ボタンのことになります。F5です。 今はルーティングがpostであるconfirmアクション内で、 無理やりrenderでビューを表示させるようにしているので、 ブラウザの更新ボタンではgetメソッドを探しに行ってしまってルーティングエラーになってしまうんです。。
guest

回答3

0

しかしながら、ビューを表示した後にブラウザの更新ボタン(F5)を押すとルーティングエラーになってしまいます。

通常、「購入処理中にリロードなど、ブラウザの機能を使った移動はしないでください」の注意書きで済ませます。

きちんと対応しようとすれば相応の工数がかかりますが、対応したことによるメリットがさほど見込めないので、往々にして省略されます。

投稿2019/04/24 08:26

maisumakun

総合スコア145183

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

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

takuan1108

2019/04/24 10:08

ありがとうございます! めっちゃ経験ある方が仰ることなので、 正攻法はないんだなと割り切りました笑 一方少し足掻いてみて、 post 'substitute' get 'confirm' として最初にpostに飛ぶようにして、 その後リダイレクトさせるという方法をとってみまして、 ブラウザの更新ボタンはエラーでなくなったのですが、 今度は戻るボタンが戻りすぎてしまう現象が起こりましてギブアップでしたw 素直に注意書きで済ませようと思います! ありがとうございました!
takuan1108

2019/04/25 11:35

すみません!技術的な解決方法を見つけたので、 そちらを今後の方のためにベストアンサーとさせていただきました。
guest

0

自己解決

解決方法を見つけたので共有します!
それはルーティングをgetとpostの2つ書くということです。

①同じconfirmアクションをgetとpostでルーティングに記述します。

Ruby

1Rails.application.routes.draw do 2 root to: 'events#index' 3 resources :events do 4 resource :guest, module:"events" do 5 collection do 6 post 'confirm' 7 get 'confirm' 8 get 'done' 9 end 10 end 11 end 12end

②コントローラーではgetでもpostでも同じconfirmアクションが叩かれるので、
もし処理を分けたいならrequest.post?(またはrequest.get?)で分けます。

Ruby

1 def confirm 2 if request.post? 3 session[:guest] = guest_params 4 render action: "confirm" 5 end 6 end 7 8 private 9 def guest_params 10 params.require(:guest).permit(:name, :email) 11 end

こうすることによってpostでパラメーターを送ることができ、
かつ、ブラウン座の更新ボタンが押されてgetでリクエストが飛んでもちゃんと表示されます!

投稿2019/04/25 11:16

takuan1108

総合スコア56

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

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

0

関係ない設定を削るときに欠落しただけかもしれませんが、 do~end が不足しているように思えます

ruby

1resource :payment, module:"guests" do 2 collection do 3 post 'confirm' 4 end 5end

またAjax等に逃げても結局URL経由でのアクセスは変わらないので、URLが怪しいならまた問題が発生するでしょう
URL定義を確かめ根本の問題を解消すべきだと思います
routes.rb が実際にどんなURLになっているか確認してはどうでしょう?

bundle exec rake routes

※) 出力が多すぎて探しにくいなら grep で絞りましょう

bundle exec rake routes | grep payment

投稿2019/04/24 08:07

Ighrs

総合スコア656

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

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

takuan1108

2019/04/24 08:23

回答ありがとうございます。 rake routesはよく使っておりまして、 今回post 'confirm'にした理由としては、 form_forでpostメソッドで送りたかったからなんです。 ですのでルーティングを、get 'confirm'とした上で、 postメソッドでURLに含めずparamsを送れる方法があるのなら、 その方がいいのですが。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問