railsでチェックボックスのバリデーションの実装方法(単数と複数の場合)
かなり悩みました。合わせると10時間くらいは悩んで、ググっていたような。PHPキャンプで講師の先生に条件分岐、アルゴリズムについて教えてもらったら(全然関係のないナベアツ、素数判定だが)、チェックボックスの実装についても閃いた。
まずは「規約に同意しますか?」などの実装方法。
views/hoge.html.erb
<%= f.check_box :属性名, {オプション}, 'チェックした時の値', 'チェックしなかった時の値' %>
<%= f.check_box :concent, {}, '規約の同意', ` 同意します`, false %> #エラーメッセージの表示 <% if @inquiry.errors.any? %> <div class="alert alert-danger" role="alert"> <strong><%= @inquiry.errors.count %>件のエラーがあります</strong> <ul> <% @inquiry.errors.each do |attr, msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %>
いちおうコントローラも
def index # 入力画面を表示 if session[:inquiry] @inquiry = Inquiry.new session[:inquiry] else @inquiry = Inquiry.new render :action => 'index' end end
次はモデル 今回はモデルに基づかないactiveRecord::Baseを使う。データベースには保存されない。保存する必要がない問い合わせフォームなどを想定。 app/models/inquiry.rb
class Inquiry < ActiveRecord::Base #アクセサメソッドで読み込み、書き込みを可能に arrt_acccessor :concent #acceptanceはチェックボックスでチェックされているか検証。messageオプションでバリデーションに引っかかった時メッセージを表示させる。 validates :concent, :acceptance => {:message => 'チェックしてください'} 次は「好きな飲み物」を3つのうちから1つ選んでもらう実装方法。自作のメソッドを用意する。 `<%= f.check_box :属性名, {オプション}, 'チェックした時の値', 'チェックしなかった時の値' %>` チェックしなかった時の値をfalseにする。 つまり `<%= f.check_box :属性名, {オプション}, 'チェックした時の値', 'false' %>`にする。 nil?とfalseでバリデーションに引っかかる。 errors.addでメッセージを自作できるらしい。 はじめ属性名を`errors.add(:milk,:cofee,:tea...)`にしたら怒られた。属性名は1個で十分。 models/inquiry.rb
バリデーションを自作する。
attr_accessor :milk, :coffee, :tea validate :check_box def check_box if milk.nil? && coffee.nil? && tea.nil? errors.add(:milk, "入力してください") end