お問い合わせフォームでよくあるパターンといえば
入力画面 → 確認画面 → 完了画面
ですよね。
ということで、確認画面をかます対応をしてみます。
方法としては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