今回はコンタクトフォームに確認チェックボックスを追加する方法を記載します。
送信ボタンの上あたりにある「上記の内容で送信します。よろしければチェックを入れてください。」というやつです。
コンタクトフォームだけでなく、ユーザー登録画面の「規約に同意する。」といったチェックボックスにも使えます。
送信ボタンの上あたりにある「上記の内容で送信します。よろしければチェックを入れてください。」というやつです。
コンタクトフォームだけでなく、ユーザー登録画面の「規約に同意する。」といったチェックボックスにも使えます。
Model
class Contact include ActiveModel::Model attr_accessor ..., :confirm # confirmを追加 ... validates_acceptance_of :confirm, allow_nil: false end
確認チェックボックスのvalidatesのみ記載しています。
これで、ビューから送られてくる確認チェックボックスの状態がfalseだった場合、validationが失敗という判定になります。
これで、ビューから送られてくる確認チェックボックスの状態がfalseだった場合、validationが失敗という判定になります。
View
<div class="form-check"> <%= form.check_box :confirm, class: 'custom-control-input' %> <%= form.label :confirm, '上記の内容で送信します。よろしければチェックを入れてください。', for: 'contact_confirm', class: 'custom-control-label' %> </div>
ビューはこんな感じです。普通にチェックボックスを追加するだけです。
しかしひとつ問題があります。このチェックボックスからは、チェックオンのときは"1"が、チェックオフのときは"0"が送られます。
Rubyは"0"も"1"もtrueと判定されるため、このままではModelで設定したvalidationが意味をなしません。
しかしひとつ問題があります。このチェックボックスからは、チェックオンのときは"1"が、チェックオフのときは"0"が送られます。
Rubyは"0"も"1"もtrueと判定されるため、このままではModelで設定したvalidationが意味をなしません。
Controller
def sending params[:contact][:confirm] = ActiveRecord::Type::Boolean.new.cast(params[:contact][:confirm]) @contact = Contact.new(contact_params) if @contact.valid? ContactMailer.send_mail(@contact).deliver_now redirect_to contact_done_path else render :index end private def contact_params params.require(:contact).permit(..., :confirm) # confirmを追加 end end
あまり美しくないコードではありますが、やっていることはわかってもらえると思います。
要は"0"をfalseに、"1"をtrueに変換してからvalidationの判定を行っています。
ちなみに、Viewのチェックボックスに引数を追加して"1"/"0"ではなくtrue/falseを送ることができるという情報もありましたが、なぜかうまくいかなかったのでこの方法になりました。
Railsのバージョンアップでチェックボックスの引数が廃止されたとかなんでしょうか…
でもチェックボックスの状態をtrue/falseにするシーンって多いだろうし、むしろそれがデフォルトでもいいくらいだと思うんですが…
要は"0"をfalseに、"1"をtrueに変換してからvalidationの判定を行っています。
ちなみに、Viewのチェックボックスに引数を追加して"1"/"0"ではなくtrue/falseを送ることができるという情報もありましたが、なぜかうまくいかなかったのでこの方法になりました。
Railsのバージョンアップでチェックボックスの引数が廃止されたとかなんでしょうか…
でもチェックボックスの状態をtrue/falseにするシーンって多いだろうし、むしろそれがデフォルトでもいいくらいだと思うんですが…