概要
お世話になります。
今回、Rails5を使って、問い合わせ作成画面 => 確認画面に遷移 => データベースに登録と遷移させようとしています。
問い合わせ作成画面はContactモデルを利用し、NULLを許容しないtitleカラムとbodyカラムがあります。
(rails g scaffold contact title:string body:textで作成)
実装したい内容
実装したい内容は以下の通りです。
- 問い合わせ作成画面 => 確認画面に遷移 => データベースに登録
- 確認画面で「戻る」ボタンが押された場合、問い合わせ作成画面に戻る(入力したデータはそのまま)
- ブラウザの戻る機能を使われた場合も、問い合わせ作成画面に遷移した際、入力データを保持する、あるいは何らかの方法で渡し表示する
- 戻る/進む機能を使われた場合も、確認画面に遷移する(hidden_fieldの値も保持する、あるいはなんらかの方法で渡す)
困っていること
確認画面に遷移し、「戻る」ボタンを押して問い合わせ作成画面に戻ることはできるようになりました。
つまり、上記実装したい内容の1.と2.の部分は問題ありません。
しかし、ブラウザの戻る機能を利用して問い合わせ作成画面に戻ると、入力したデータが消えます(実装したい内容 3.)。
また、
- ブラウザの戻る機能を利用して、確認画面から問い合わせ作成画面に遷移
- ブラウザの進む機能を利用して、問い合わせ作成画面から確認画面に進もうとする
という手順を実行すると、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
あなたの回答
tips
プレビュー