Ruby
Rails

インターン 3日目 (1月31日)

今回の「言い訳」:休学届けを出しに行っていた+不動産を探していたため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

これは以下のようになる
collectionmember.png
ここで1つ注意があります。collectionもmemberも指定せずに書いた場合はデフォルトで「member扱い」となります。

config/routes.rb
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で確認メージに飛ばす

app/views/inquiry/index.html.erb
<%= 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入力画面へ差戻す。

app/controllers/inquiry_controller.erb
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に入れらる。

app/views/inquiry/confirm.html.erb
<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画面に戻す、または登録の実行を行う。

app/controllers/inquiry_controller.erb
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日目へ