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

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

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

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

Q&A

1回答

3956閲覧

Railsで新規作成→確認画面→完了画面の順に実装したい

nyan_tech_24

総合スコア17

Ruby on Rails 5

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

0グッド

1クリップ

投稿2020/09/07 00:59

編集2020/09/07 01:02

前提・実現したいこと

以下写真のような新規作成→確認画面→完了画面の実装がしたいです。

イメージ説明

イメージ説明

イメージ説明

現在は新規作成~完了までの流れは実装済みです。

問題は登録完了後にブラウザバックをすると作成中に以下のようなエラーメッセージが出てしまいます。

イメージ説明

試したこと

エラー分通りRouting部分をPOSTではなくGETに変えました。

すると、以下のように新規作成時にエラーがでるので、

イメージ説明

RoutingのConfirmにGETとPOSTを記述しました。

すると登録完了までは無事にできますが、完了後に再度ブラウザバックをすると以下のようなエラーがでます。

イメージ説明

ここから先どうを進めて良いのか分からずに困っています。

ちなみにブラウザはChromeでもSafariでも同じエラーが出ます。

該当のソースコード

ソースコードは以下です。

config/routes.rb

ruby

1Rails.application.routes.draw do 2 root to: 'registrations#index' 3 resources :registrations, only: [:index, :new, :create] do 4 collection do 5 get :confirm 6 post :confirm 7 get :finish 8 end 9 end 10end

app/models/registration.rb

ruby

1class Registration < ApplicationRecord 2 validates :name, presence: true 3end

app/controllers/registrations_controller.rb

ruby

1class RegistrationsController < ApplicationController 2 def index 3 @registrations = Registration.all 4 end 5 6 def new 7 @registration = Registration.new 8 end 9 10 def confirm 11 @registration = Registration.new(registration_params) 12 unless @registration.valid? 13 flash.now[:danger] = "正しく入力してください。" 14 render :new 15 end 16 end 17 18 def create 19 @registration = Registration.new(registration_params) 20 21 if params[:back].present? 22 render :new 23 return 24 end 25 26 if @registration.save 27 redirect_to action: :finish 28 else 29 flash.now[:danger] = "登録に失敗しました。" 30 render :new 31 end 32 end 33 34 def finish 35 end 36 37 private 38 def registration_params 39 params.require(:registration).permit(:name) 40 end 41end

app/views/registrations/new.html.erb

<%= form_with( model: @registration, local: true, url: {action: :confirm}) do |f| %> <h2>登録手続き</h2> <% if @registration.errors.any? %> <div id="error_explanation"> <%= @registration.errors.count %>件のエラーがあります。 <ul> <% @registration.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= f.label :name %> <%= f.text_field :name %> </div> <div class="actions"> <%= link_to '登録一覧へ', root_path %> <%= f.submit '確認する' %> </div> <% end %>

app/views/registrations/confirm.html.erb

<%= form_with( model: @registration, local: true, url: {action: :create}) do |f| %> <h2>登録確認</h2> <%= hidden_field_tag :finish, true %> <%= f.hidden_field :name %> <div class="field"> <%= f.label :name %> <%= @registration.name %> </div> <div class="actions"> <%= f.submit '登録作成へ戻る', name: 'back' %> <%= f.submit '完了する' %> </div> <% end %>

app/views/registrations/finish.html.erb

<h1>登録完了しました。</h1> <p><%= link_to '登録一覧へ戻る', root_path %></p>

また以下が私の実装しているGitHubのリンクです。
https://github.com/yyytuit/confirm

補足情報

DBはMysqlです。
Railsのバージョンは5.2.4です。

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

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

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

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

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

guest

回答1

0

実装したことがないので調べてみたところ、詳しく記載してある記事がありましたので共有します。

https://qiita.com/ngron/items/d55aac6e81a9fb2fe81c


個人的には確認画面だけのためにアクションを追加するのはやりすぎな感じがします。
そのため標準機能で補うのも一案かと思います。

data: {confirm: "この内容で登録しますか?"}

利点としては、一行で実装できることと、少し設定すればデザインをカスタマイズすることもできます。


参考:Railsガイド:確認ダイアログ
参考:railsでgithubみたいな確認ダイアログを簡単に設定する方法

投稿2020/09/07 02:11

no1knows

総合スコア3365

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

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

nyan_tech_24

2020/09/07 02:15

解答ありがとうございます。 そうですね。その上記実装は以前にやって、その時にエラーは出なかっと思います。 ただどうしても完了画面を見せたい要件がありまして、このような実装になっています。
no1knows

2020/09/07 02:47 編集

すいません。大切な完了画面の実装を見逃していました。 「ブラウザバックをクリックした時にどのページに遷移することを期待しているのか」 を質問に追記しておくと、実装経験のある方から答えをもらえるかもしれません。 ちなみに戻るボタンではなく、ブラウザバックは、サーバーサイド(Rails)の話ではないので、本来はJavaScriptなどで実装するほうが適切なアプローチのような気がします。(実際どうなんだろう) またTurbolinksを利用しているとさらに複雑になるかもしれないですが・・・ https://teratail.com/questions/252619
nyan_tech_24

2020/09/07 22:56

no1knowsさん、参考サイトありがとうございます。 参考サイトを拝見させていただいたのですが、JavaScriptがまだ未熟で、本件でどのように実装すればいいのか分からず手が止まってしまいます。 どこのページに以下を書くと動くようになるか、ご教示いただけないでしょうか? ``` $(function(){ history.pushState(null, null); $(window).on("popstate", function (event) { location.href = "任意のpath"; }) }); ```
no1knows

2020/09/08 00:06

> 「ブラウザバックをクリックした時にどのページに遷移することを期待しているのか」 とTurbolinks実装の有無を追記ください。 ちなみに書くのはapplication.jsなどで良いかと思います。 実装の際はどのコントローラーのどのアクションでそのコードを実施するか?といった内容も必要となります。
nyan_tech_24

2020/09/08 00:18

no1knowsさん失礼しました。 > 「ブラウザバックをクリックした時にどのページに遷移することを期待しているのか」 とTurbolinks実装の有無を追記ください。 ブラウザバックなので、例えばブラウザバックすると以下のようにしたいです。 完了画面→確認画面 確認画面→新規作成画面 新規作成画面→ホーム またTurbolinksは入れてません。
no1knows

2020/09/08 00:49

個人的にこの実装はやめておいたほうが良いかと思います。 理由としては、仕様にかなり無理があるのとControllerの動きをきちんと把握できていない印象だからです。 まぁどうにか実装しようとしたらできるのでしょうが・・・ここに労力を割くのがもったいないです。 なぜ仕様に無理があるのかについて説明します。 完了画面→確認画面ですが、すでにデータをDBに保存した状態から確認画面に戻るわけですが、 戻った状態=データは保存されていない状態が正しいということになるかと思います。 (戻った状態でブラウザを閉じた時にデータが保存されていたらユーザーからみるとよくわからない状態になるので・・・) とするとそこでデータを削除して、さらに登録していた値をブラウザに保持させる必要がでてきそうです。 もちろんページ遷移時の操作(上記JavaScriptなど)も必要となるかと思います。 考えることも実装することも盛り沢山になってしまいます。 上記と下記のユーザビリティの違いはそんなにないような気がするので(まぁここは個人差がありますが・・・)標準的な実装をみやすくわかりやすくしてあげたほうが、あとからのエラーやバグに悩まされなくて良いと思います。 ①Rails標準機能のdata: {confirm: "この内容で登録しますか?"}で確認ダイアログを表示させる ②保存完了時にflashメッセージを表示させる 参考:https://qiita.com/dice9494/items/2a0e92aba58a516e42e9 なんなら②のflashメッセージを画面いっぱいに表示させて数秒で消えるとかにしておいてもいいのかな・・・
nyan_tech_24

2020/09/10 05:31 編集

no1knows 回答ありがとうございます。 jsの件も考慮にいれながら、cookieを持たせるなど別のアプローチがないか検討します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問