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

>今回の「言い訳」：休学届けを出しに行っていた+不動産を探していたため3時間くらいしか作業できなかった。

今回は申し込みページで、申し込み内容を登録したあと、確認ページに飛んでからDBの登録を終わらせたい。
今回の内容は以下の内容から多くを引用しております。
[参考](https://qiita.com/inodev/items/b5600de8580f473cfa94)

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あり」と覚えましょう。以下のルーティングを例に取ります。
>
```ruby
resources :books do
  collection do
    post :search
    post :remove_multi
  end
  member do
    get :thumbnail
    get :sample_file
  end
end
```
これは以下のようになる
![collectionmember.png](https://qiita-image-store.s3.amazonaws.com/0/228601/05c47d22-710a-8595-a7b0-d536d7cca1c9.png)
ここで1つ注意があります。collectionもmemberも指定せずに書いた場合はデフォルトで「member扱い」となります。




```ruby: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で確認メージに飛ばす

```ruby: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入力画面へ差戻す。

```ruby: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属性とはなんぞや](https://www.mitsue.co.jp/knowledge/blog/frontend/201412/04_1400.html)
submitのname属性を入れるとparamsに入れらる。

```ruby: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画面に戻す、または登録の実行を行う。

```ruby: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日目へ