ihatov08 blog

プログラミング初心者だけどRailsとSwiftマスターします

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