RubyOnRailsのバリデーションで不正投稿を防ぐやり方

バリデーション

RubyOnRailsのバリデーションはテーブルへの不正な投稿を防ぐ仕組みです。たとえば空文字とか最大文字数を設定してテーブルへのデータの追加を防ぎます。バリデーションの定義はmodelファイルで行います。

modelファイルの場所は アぷケーション\app\models にあります。

バリデーションの書き方

10.バリデーション
バリデーションの書き方は validate を先頭に書いて、カラム名とバリデーションの内容を指定します。バリデーションの内容はハッシュで記述します。

class Post < ApplicationRecord
  validates :content, {presence: true, length: {maximum: 140}}
end

バリデーションは不正な投稿がされた場合に働きますが、不正な投稿がされた場合にどのような処理をするかはコントローラーのアクションで記述する必要があります。具体的にはバリデーションが働いているかいないかの真偽値をsave()メソッドで取得し、条件分岐させます。

saveメソッドの戻り値

RubyOnRailsのsave()メソッドはテーブルにデータを保存するためのメソッドで、save()メソッドは保存に成功すると true。
save()メソッドで保存に失敗すると false を返します。

save()メソッドが失敗するときはバリデーションに引っかかっているときです。

バリデーションでデータベースの保存に失敗したときにリダイレクト先を条件分岐でわけることができます。

def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      redirect_to("/posts/index")
    else
      # renderメソッドを用いて、editアクションを経由せず、posts/edit.html.erbが表示されるようにしてください
      redirect_to("/posts/#{@post.id}/edit")
    end
  end

save()メソッドで失敗したときのエラーメッセージ

RubyOnRailsではバリデーションの設定にひっかかってしまってsave()メソッドが失敗したときに自動でエラーメッセージを生成する機能が備わっているようです。エラーメッセージを取得するには
 テーブルのインスタンス.errors.full_messages  で取得できます。

  • errors.full_messagesはsave()メソッドで失敗する前は空の配列
  • errors.full_messagesはsave()メソッドで失敗した後は「Contentを入力してください」というメッセージが配列になって入っています。

errors.full_messagesは配列で取得できるのでエラーメッセージをを表示させる場合はeach文を使って表示させます。

render()メソッドの使い方

render()メソッドはバリデーションに失敗してもリダイレクトしないようにして投稿の内容をそのまま維持したいときに使います。

11.renderメソッド

render()メソッドの引数にはフォルダ名とファイル名を指定します。render()メソッドを使用すると引数で指定したファイルでそのまま変数を使用することが可能になります。

render()メソッドはバリデーションで失敗したときはrenderで指定したページが表示されます。投稿内容を維持したい場合はアクション内の変数をhtmlファイルで使用するようにします。

render()メソッドの指定先のhtmlファイルで変数を使う際の注意点は 対象のアクションがインスタンスをもっているか確認することです 

その他のバリデーション

{uniqueness: true} データの重複を許さない