コンタクトフォームに確認チェックボックスを追加する方法

2019年12月1日 21:26
    今回はコンタクトフォームに確認チェックボックスを追加する方法を記載します。
    送信ボタンの上あたりにある「上記の内容で送信します。よろしければチェックを入れてください。」というやつです。
    コンタクトフォームだけでなく、ユーザー登録画面の「規約に同意する。」といったチェックボックスにも使えます。

    Model

    class Contact include ActiveModel::Model
      attr_accessor ..., :confirm   # confirmを追加
      ...
      validates_acceptance_of :confirm, allow_nil: false
    end
    確認チェックボックスのvalidatesのみ記載しています。
    これで、ビューから送られてくる確認チェックボックスの状態が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が意味をなしません。

    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にするシーンって多いだろうし、むしろそれがデフォルトでもいいくらいだと思うんですが…

    関連記事

    関連記事はありません。