Railsで登録の際に確認画面を挟むベスト・プラクティス

Railsで登録する際に確認画面を挟む実装って割りとよくありそうだし、実際自分でもやったことがあるけどイマイチ設計でしっくりきていなかった。また、ネットで出てくるそれ系の情報も微妙なものが多い気がする。そんな中、最近業務で作ったやつは他の人にFBもらいつつ良い感じにできたのではと思えたので共有する。

サンプルとしてユーザーの投稿画面があるとする
f:id:rakio1234:20170109223819p:plain:w300

このときpostする先をconfirmとかにする

post :confirm

バリデーションは確認画面に遷移する前にしときたい

  def confirm
    @user = User.new(user_params)

    return if @user.valid?

    render :new
  end

確認画面はこんな感じ
f:id:rakio1234:20170109230635p:plain:w300

確認画面なので間違っていたら前の画面に戻りたいし
入力した値はフォームにセットされている状態が望ましい
なのでhiddenで値を持っといてpostして戻るようにする

<%= form_for :user, url: new_users_path do |f| %>
  <%= f.hidden_field :name %>
  <%= f.hidden_field :email %>
  <%= f.hidden_field :sex %>
  <%= f.submit '入力画面へ戻る'%>
<% end %>

backメソッドで入力画面を呼び出す

  def back
    @user = User.new(user_params)

    render :new
  end

入力画面に戻った際のurlは users/back でなく users/newでありたい
なのでroutingを設定

post :new, path: :new, as: :new, action: :back

createとpathメソッド名がかぶって上手く動作しなくなるのでpathとasオプションを使う


確認あとの登録もhiddenから値を渡すようにする

<%= form_for :user, url: users_path do |f| %>
  <%= f.hidden_field :name %>
  <%= f.hidden_field :email %>
  <%= f.hidden_field :sex %>
  <%= f.submit '登録する'%>
<% end %>
  def create
    User.create!(user_params)

    render :complete
  end

f:id:rakio1234:20170109233026p:plain:w300

以上、変なとこあればFBください。

サンプルコードはこちら
github.com