2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-01

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?