Ruby
Rails

railsのバリデーションのgem作った

railsのバリデーションをモデルごとではなくValidatorクラスを作成してそれを用いてバリデーションを作るgemを作成しました。

https://github.com/ippachi/ca-validation

使用方法ですがまずバリデーションクラスを作成します。

作成する場所は好きなところで構いませんが app 以下が私のおすすめです。

# app/validators/add_book_validator.rb

class AddBookValidator
include Ca::Validation

validate do
required(:book).schema do
required(:title).filled(:str?)
required(:author_name).filled(:str?)
end
end
end

そうしたらコントローラー、及びビューで

def create

if params.valid?(AddBookValidator)
book = Book.create(params.result[:book])
redirect_to book
else
render :new
end
end

<% if params.errors.any? %>

<div id="error_explanation">
<h2><%= pluralize(params.errors[:book].count, "error") %> prohibited this book from being saved:</h2>

<ul>
<% params.errors(full: true)[:book].each do |k, message| %>
<li><%= message.first %></li>
<% end %>
</ul>
</div>
<% end %>

のように使用できます。

このgemは dry-validation をラッパーしているものなので詳しい使い方は https://dry-rb.org/gems/dry-validation/comparison-with-activemodel/ を参照してください


小話

規模感にもよりますがある程度の規模のアプリケーションになったら、モデルでのバリデーションやコールバックは避けたほうがいいです。

なぜなら、バリデーションやコールバックの種類が多くなりモデルに on: :create などが大量に増えてしまい、どのコードが実際に走るかがわからなくなります。

なのでアプリケーションが大きくなってきたり、大きくなるのがわかっている場合はバリデーションはコントローラに、コールバックはユースケース層に実装するなどしたほうが良いでしょう