再利用可能なバリデーションクラスの実装を試みる


はじめまして、モバイルソリューション事業部の望月です。Railsでモバイルアプリのバックエンド開発をやっています。
いきなりですが、dry-rbってご存知でしょうか。


dry-rb is a collection of next-generation Ruby libraries

分かりやすく言うとイケてるgem群らしいです。


これまたいきなりじゃが、dry-validationのDry::Validation::Schemaを継承したクラスを作って、DSL用のメソッドなんかを生やすじゃろ。


lib/schemas/base.rb
class Base < Dry::Validation::Schema
def self.validation(**options, &block)
define(schema_class: self, &block)
end

def self.call(attributes = {})
new.call(attributes)
end
end


そいつを継承したクラスを作ってvalidationを定義するのじゃ。
これはたとえば会員登録されたユーザーの定義じゃな。


lib/schemas/user/signed.rb
module User
class Signed < Base
validation do
required(:email).filled(:str?)
required(:name).filled(:str?)
end
end
end

悪いことしてBANされたユーザーならこうじゃ。


lib/schemas/user/signed.rb
module User
class Banned < Signed
validation do
required(:banned).value(eql?: true)
end
end
end

するとこうなるわけじゃ



Schemas::User::Signed.call(email: "", name: "").messages
=> {:email=>["must be filled"], :name=>["must be filled"]}

Schemas::User::Banned.call(email: "seesaa-kun@seesaa-kun.jp", name: "").messages
=> {:name=>["must be filled"], :banned=>["is missing", "must be equal to true"]}


こんな感じにユーザーの状態毎にバリデーションを定義できて便利に再利用できそうというやつじゃ。リクエストパラメータの検証やフォームオブジェクト、何ならActiveModelのカスタムバリデーターから使っても良さそうじゃな。



dry-validationというgemを使って再利用可能なバリデーションクラスの実装を試みる一例を紹介しました。


自分好みの使い方で書いたので試してみたいときはドキュメントを見て使うと良いと思います。trailblazerのreformでもdry-validationを使っているのでRailsならこっちでも良さそうです。


現場からは以上です!で〆てみたいけど現場では使ってません悪しからず!



この記事へのコメント