今回の「言い訳」:休学届けを出しに行っていた+不動産を探していたため3時間くらいしか作業できなかった。
今回は申し込みページで、申し込み内容を登録したあと、確認ページに飛んでからDBの登録を終わらせたい。
今回の内容は以下の内容から多くを引用しております。
参考
form_for()から送った内容をいきなりDBに飛ばして保存をしないで、確認ページに一度飛ばしてから、戻るor登録を行う。
実装する内容
- indexページからconfirmページへ遷移可能に
- indexページからconfirmへ行く時にバリデーションチェック
- confirmページでindexページの内容を確認可能に
- confirmページからindexページに戻るボタンを設置
- confirmページから登録
1,確認ページのroutingの追加
confirmというページで確認が行えるようにする。
=> このcollectionはなに?
collectionとmember
既に見たように、resourcesを使用すれば主要な7つのルーティングが自動的に追加されますが、 それ以外のルーティングをそのリソースに追加したい場合はmemberまたはcollectionを使用します。
さっきの「複数形はidなし、単数形はidあり」と同じ考え方で、「collection(集合)はidなし、member(個別)はidあり」と覚えましょう。以下のルーティングを例に取ります。
resources :books do
collection do
post :search
post :remove_multi
end
member do
get :thumbnail
get :sample_file
end
end
これは以下のようになる
ここで1つ注意があります。collectionもmemberも指定せずに書いた場合はデフォルトで「member扱い」となります。
Rails.application.routes.draw do
resources :inquiry do
collection do
post :confirm
end
end
#中略
end
$ rake routes
Prefix Verb URI Pattern Controller#Action
confirm_inquiry POST /inquiry/confirm(.:format) inquiry#confirm # <=追加URL
2,FormからPostで確認メージに飛ばす
<%= form_for @inquiry, :url => { :controller => :inquiry, :action => :confirm } do |f| %>
<div class="form-group">
<%= f.label :name,"名前" %><br>
<%= f.text_field :name %>
</div>
<div class="form-group">
<%= f.label :phone_number ,"電話番号"%><br>
<%= f.text_field :phone_number %>
</div>
<div class="form-group">
<%= f.label :mail ,"メールアドレス" %><br>
<%= f.text_field :mail %>
</div>
<%= f.submit '内容の確認に進む'%>
<% end %>
form_for は ,以下に示すような:urlのオプションにより、
:url => { :controller => :inquiry, :action => :confirm }
post実行後のコントローラーとアクションの指定ができる。なお、actionのみの指定ももちろん可能です。
2.2 確認アクションの内容を入れる
Controllerに対応のconfrimアクションを入れる。
view該当するデータを表示するためにインスタンス変数で取得する。
invalid?とvalid?メソッドはバリデーションチェックを行うメソッド。
バリデーションエラーになったらForm入力画面へ差戻す。
def confirm
# POSTされたパラメータを取得
@inquiry = Inquiry.new(inquiry_params)
# バリデーションチェックNGなら戻す
render :index if @inquiry.invalid?
end
3.1 確認ページの実装
登録や戻るの際にPOSTでデータを送る際にhidden_field
で情報を保持している。
また、戻る処理を実現するために,name属性を使用して、createアクション内で分岐を行う。
=>submitのname属性とはなんぞや
submitのname属性を入れるとparamsに入れらる。
<div class="container">
<%= form_for @inquiry, :url => { :controller => :inquiry, :action => :create} do |f| %>
<div class="form-group">
名前: <%= @inquiry.name %><br>
<%= f.hidden_field :name %>
</div>
<div class="form-group">
電話番号: <%= @inquiry.phone_number %><br>
<%= f.hidden_field :phone_number %>
</div>
<div class="form-group">
メールアドレス: <%= @inquiry.mail %><br>
<%= f.hidden_field :mail %>
</div>
<%= f.submit '戻る' ,name: 'back'%>
<%= f.submit '申し込み完了'%>
<% end %>
</div>
3.2 登録アクションに実装
f.submit
のname属性の指定有無でnew画面に戻す、または登録の実行を行う。
def create
inquiry = Inquiry.new(inquiry_params)
if params[:back]
render :index
elsif inquiry.save
redirect_to inquiry_path(id: inquiry.id),notice: "申し込みが完了しました。"
else
render :index
end
#中略
end
このあとは写真の納品作業を管理画面から行うために必要なgemであるcarrierwave
を勉強中 => 4日目へ