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

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

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

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Q&A

0回答

623閲覧

Railsで確認画面機能を作成した際、ブラウザの戻る/進む機能を使うとルーティングエラーが発生したり、入力した情報が消える

YutaTanikawa

総合スコア8

Ruby on Rails 5

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

0グッド

0クリップ

投稿2019/08/20 05:20

概要

お世話になります。

今回、Rails5を使って、問い合わせ作成画面 => 確認画面に遷移 => データベースに登録と遷移させようとしています。
問い合わせ作成画面はContactモデルを利用し、NULLを許容しないtitleカラムとbodyカラムがあります。
(rails g scaffold contact title:string body:textで作成)

実装したい内容

実装したい内容は以下の通りです。

  1. 問い合わせ作成画面 => 確認画面に遷移 => データベースに登録
  2. 確認画面で「戻る」ボタンが押された場合、問い合わせ作成画面に戻る(入力したデータはそのまま)
  3. ブラウザの戻る機能を使われた場合も、問い合わせ作成画面に遷移した際、入力データを保持する、あるいは何らかの方法で渡し表示する
  4. 戻る/進む機能を使われた場合も、確認画面に遷移する(hidden_fieldの値も保持する、あるいはなんらかの方法で渡す)

困っていること

確認画面に遷移し、「戻る」ボタンを押して問い合わせ作成画面に戻ることはできるようになりました。
つまり、上記実装したい内容の1.と2.の部分は問題ありません。

しかし、ブラウザの戻る機能を利用して問い合わせ作成画面に戻ると、入力したデータが消えます(実装したい内容 3.)。

また、

  1. ブラウザの戻る機能を利用して、確認画面から問い合わせ作成画面に遷移
  2. ブラウザの進む機能を利用して、問い合わせ作成画面から確認画面に進もうとする

という手順を実行すると、2.の段階でGETリクエストが送信され、No route matches [GET] "/contacts/new/confirm"エラーが発生します(実装したい内容 4.)。

不足している情報がございましたら追記したいと思います。
現在の実装は下記の通りです。

独学で学んでいるので、わかりにくいところがあるかもしれませんが、ご教示いただけると助かります。
よろしくお願いいたします。

現在の実装

ruby

1# app/controllers/contacts_controller.rb 2 3class ContactsController < ApplicationController 4 before_action :set_contact, only: [:show, :edit, :update, :destroy] 5 6 # 中略 7 8 def new 9 end 10 11 def confirm_new 12 @contact = Contact.new(contact_params) 13 render :new if @contact.invalid? 14 end 15 16 def create 17 @contact = Contact.new(contact_params) 18 19 if params[:back].present? 20 render :new 21 return 22 end 23 24 respond_to do |format| 25 if @contact.save 26 format.html { redirect_to @contact, notice: 'Contact was successfully created.' } 27 format.json { render :show, status: :created, location: @contact } 28 else 29 format.html { render :new } 30 format.json { render json: @contact.errors, status: :unprocessable_entity } 31 end 32 end 33 end 34 35 # 中略 36 37 private 38 def set_contact 39 @contact = Contact.find(params[:id]) 40 end 41 42 def contact_params 43 params.require(:contact).permit(:title, :body) 44 end 45end

Ruby

1# app/view/contacts/new.rb 2 3<h1>New Contact</h1> 4 5<%= form_with(model: @contact, local: true, url: confirm_new_contact_path) do |form| %> 6 <% if @contact.errors.any? %> 7 <div id="error_explanation"> 8 <h2><%= pluralize(@contact.errors.count, "error") %> prohibited this contact from being saved:</h2> 9 10 <ul> 11 <% @contact.errors.full_messages.each do |message| %> 12 <li><%= message %></li> 13 <% end %> 14 </ul> 15 </div> 16 <% end %> 17 18 <div class="field"> 19 <%= form.label :title %> 20 <%= form.text_field :title %> 21 </div> 22 23 <div class="field"> 24 <%= form.label :body %> 25 <%= form.text_area :body %> 26 </div> 27 28 <div class="actions"> 29 <%= form.submit %> 30 </div> 31<% end %> 32 33<%= link_to 'Back', contacts_path %>

Ruby

1# app/view/contacts/confirm_new.rb 2 3<h1>Confirm_new_Contact</h1> 4 5<%= form_with(model: @contact, local: true) do |form| %> 6 <div class="field"> 7 <%= @contact.title %> 8 <%= form.hidden_field :title %> 9 </div> 10 11 <div class="field"> 12 <%= @contact.body %> 13 <%= form.hidden_field :body %> 14 </div> 15 16 <div class="actions"> 17 <%= form.submit "戻る", name:'back' %> 18 </div> 19 20 21 <div class="actions"> 22 <%= form.submit %> 23 </div> 24<% end %>

Ruby

1# config/routes.rb 2 3Rails.application.routes.draw do 4 resources :contacts do 5 post :confirm, action: :confirm_new, on: :new 6 end 7end

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問