スポンサーリンク

【Ruby on Rails】with_optionsを用いた共通のバリデーションの設定

みなさんこんにちは!
のむ(@nomu_engineer)です!

今回の記事では、with_optionsを用いた共通のバリデーションの設定の仕方についてまとめました。

with_optionsについて理解したい方は是非最後まで読んでみてください!

この記事を読むメリット
・with_optionsを理解できる
・with_optionsを記述できる様になる

この記事を読むおすすめの読者
・プログラミング初心者
・駆け出しエンジニア

それでは早速本題に入っていきたいと思います!

with_optionsって何??って思った方もいると思います。
簡単にまとめると、with_optionsとは、全てのバリデーションに共通したオプションを付与できるメソッドです。

それを踏まえて、実際にどの様にwith_optionsメソッドを使うのかみていきましょう!

with_optionsを用いない書き方

with_optionsを用いない書き方は以下になります!

class User
  validates :name, presence: true
  validates :email, presence: true, uniqueness: { case_sensitive: false }
  validates :nickname, presence: true, uniqueness: { case_sensitive: false }
end

バリデーションの設定は、validatesメソッドを用いて定義します!

上記のコードをみていただくと、わかると思いますが、全てのバリデーションに、presence: trueというオプションがついていますよね??

これをwith_optionsを用いて記述します。

with_optionsの記述の仕方

with_optionsの定義の仕方は以下の様になります。

class User
  with_options presence: true do
    validates :name
    validates :email, uniqueness: { case_sensitive: false }
    validates :nickname, uniqueness: { case_sensitive: false }
  end
end

それでは一つ一つコードの詳細を説明していきます。

まず、User管理機能のバリデーションを設定するという仮定で話を進めたいと思いますので、Userモデルの中にバリデーションを記述します。

with_optionsメソッドの書き方としては、書きになります。

with_options 付与したいバリデーション do

end

with_optionsの後に付与したいバリデーションを指定して、do~endの間に適用したいカラム名を記述します。

適用したいカラムは今回は、「name」「email」「nickname」の3種類になってます。

with_optionsを用いて付与したバリデーションは 「presence: true」です。

「presence: true」は空欄はだめですよってっていうバリデーション です。

なので、今回は3種類のカラムに対して、空欄はだめですよっていうバリデーションを付与したことになります。

そして、このwith_optionsはネスト構造をとることができます。
with_optionsの中にwith_optionsを定義できるということです。

最初に記述したコードをみてもらうと、do~endの間に記述している、カラムにさらに別のバリデーションを付与しているのがわかると思います。

「uniqueness: { case_sensitive: false }」このバリデーションは一意制約を用いるためのバリデーションになります。
一意制約とは、このカラムの値は他のレコード(データ)と重複することができないですよっていうバリデーションを与えることができます。

つまるところどういうことかというと、他のユーザーとメールアドレスとニックネームは重複することができんくするための、バリデーションです。

これをネストを用いて記述すると以下の様になります。

class User
  with_options presence: true do
    validates :name
   with_options uniqueness: { case_sensitive: false } do
      validates :email
      validates :nickname
    end
  end
end

この様に記述することで、最初と同じ様に、name」には「presence: true」のバリデーションのみが適用されて、「email」と「nickname」には「presence: true」と「uniqueness: { case_sensitive: false }」の2種類のバリデーションが付与されます。

さらに、ニックネームにのみ、カタカナしかダメですよっていうバリデーションを設定するとしたら、下記の様なコードになります。

class User
  with_options presence: true do
    validates :name
   with_options uniqueness: { case_sensitive: false } do
      validates :email
      validates :nickname, format: { with: /\A[ァ-ヶー-]+\z/ }
    end
  end
end

こうすることで、ニックネームはカタカナのみOKというバリデーションが設定されます。

以上でwith_optionsを用いた共通のバリデーションの設定についての説明を終わります!

最後に

それでは最後にまとめて終わりたいと思います!

・with_optionsとは指定したカラムに共通のバリデーションを設定することができるメソッド

・with_optionsはネスト構造をとることができるということ

with_optionsは本当に便利で、よく使うメソッドなのでしっかり抑えておきましょう!

ありがとうございました!

スポンサーリンク




この記事を書いた人