バリデーションへの対応


バリーデーションとは

ほとんどの方に、フォームから値を送信する際「xxは必須です」や「xxは全角で入力してください」などと怒られた経験があると思います。この機能をバリデーションと言います。

今回はActiveRecordの機能を使ってバリデーションを実現してみましょう。

動画の流れ

実装してみる

  • 実は前回までの内容でバリデーションの実装は少しだけできています。
  • 以下の記述によりデータを保存した際にname 項目がなかった場合にエラー(偽)となります。
class Contact < ActiveRecord::Base
  validates_presence_of :name # nameの項目は必須入力という設定
end
  • 今回はさらにバリデーション機能の実装を整えていきます。
  • まずはapp.rbに以下の記述を追加します。
    app.rb
    post '/contacts' do
      puts "### これはポストされたデータです ###"
      p params

   name = params[:name]
      # ここでDBに保存する

   contact = Contact.new({name: name})
   if contact.save
       # 真
       redirect '/'
     else
       # 偽
       erb :contact_form
     end
    end
  • contact.save を条件にしたif文を書きます。これで、保存しようとした時にname項目がなかった時(バリデーションでエラーになった時)の処理が追加されました。
    • saveはエラーがなければ true 、エラーがあれば false が返ります。
    • 今回のエラーはバリデーションの設定によって起こります。
    • つまり validates_presence_of :name がなければcontact.saveをしたときにname 項目がなかったとしてもエラーになりません( contact.savetrue を返します)。
  • エラーがなければ/に、エラーがあればcontact_formに戻ります。
  • エラー時にメッセージを表示するようにcontact_form.rbに以下の内容を書きます。
        <% if @contact.errors.present? %>
            エラーがあります。
            <ul>
                <% @contact.errors.full_messages.each do |message| %>
                    <li><%=message%></li>
                <% end%>
            </ul>
        <% end %>
  • エラー時に@contactという@のついた変数が必要になるので、app.rbを少し書き換えます。
    app.rb
    post '/contacts' do
      puts "### これはポストされたデータです ###"
      p params

   name = params[:name]
      # ここでDBに保存する

   @contact = Contact.new({name: name})
   if @contact.save
       # 真
       redirect '/'
     else
       # 偽
       erb :contact_form
     end
    end

動作確認する

  • アプリケーションをbundle exec ruby app.rb -p $PORT -o $IPで起動します。
  • https://workspace-username.c9users.io/contact_newにアクセスすると以下のエラーが出てしまいました。
undifined method `errors' for nil:NilClass
  • https://workspace-username.c9users.io/contact_newにGETリクエストでアクセスした時に@contactの中身がnilであるというエラーが起きています。
  • /contact_newにGETリクエストでアクセスした際の処理が書かれているget '/contact_new'@contact = Contact.newを追加します。
get '/contact_new' do
    @contact = Contact.new # これを追加しておく。中身が空っぽの情報です。もちろんエラー情報も空です。
    erb :contact_form
end
  • 次はちゃんとバリデーションでエラー時にメッセージが出るようになります。
    • もしエラーのメッセージが二つ以上出ている人は再起動して下さい。
  • フォームに値をちゃんと入力した際はエラーメッセージが表示されないはずです。

検索してみよう

  • 「バリデーション」で検索してバリデーションの意味を確認してみましょう。
  • 「Sinatra バリデーション」で検索してSinatraでのバリデーションの使い方を確認しましょう。

今回のコードはこちらで確認することができます。

前の章へ戻る

次の章へ進む


コメントを残す