Ruby開発未経験のJava/PHPエンジニアがRuby On Railsでお問い合わせフォームを作る:確認画面編

お問い合わせフォームでよくあるパターンといえば

入力画面 → 確認画面 → 完了画面

ですよね。

ということで、確認画面をかます対応をしてみます。

方法としては2つくらいありそうです。

素直に確認画面用のアクション、テンプレートを用意する方法

http://qiita.com/inodev/items/b5600de8580f473cfa94

パラメータを付与してそれで入力画面と確認画面を振り分ける方法

http://qiita.com/mm36/items/3753cb2fa65feedb145b

今回は下の方法でやってみます。

Modelにフラグを追加

InuquryモデルにDB保存しないフラグを追加します。

app/models/inquiry.rb

validates_acceptance_of :confirm
after_validation :check_confirm

  def check_confirm
    errors.delete(:confirm)
    self.confirm = errors.empty? ? '1' : ''
  end

validates_acceptance_ofはデータの型として、「利用規約に同意します」みたいなチェックの判定用の型みたいです。

after_validationでバリデート後のメソッドを指定できるそうです。これはバリデートがOKだろうがNGだろうが呼ばれるみたいです。

コントローラーにパラメータを追加

app/controllers/inquiries_controller.rb

params.require(:inquiry).permit(:name, :zip, :prefecture, :address1, :address2, :email, :content, :confirm)

テンプレートにパラメータを追加

app/views/inquiries/_form.html.erb

hiddenパラメータとしてconfirmを追加します。入力画面の時には空、確認画面の時にはcheck_confirmを通るので1がセットされるっぽいです。

<%= f.hidden_field :confirm %>

それぞれの入力項目は@inquiry.confirmが空かどうかで判定をしています。空の場合は入力画面なのでテキストフィールドを表示、空でない場合は確認画面なので入力値の表示とhiddenで入力値を渡す処理をしています。

<% if @inquiry.confirm.blank? %>
           <%= f.text_field :content, :class => 'form-control' %>
         <% else %>
           <%= @inquiry[:content] %>
           <%= f.hidden_field :content %>
         <% end %>

次回は確認画面から入力画面に戻る処理を実装してみたいと思います。history.backだと入力欄がまっさらに戻ることがあるので、hiddenで各入力値をPOSTし直す感じになるかなと思います。

成果物

https://github.com/YoshiteruIwasaki/banana-mail/commit/0de7af47aadbac0bff5e8285f937d0ef589507c5