Rails で JSON Schema バリデーションする gem を作った
諸事情により今頃 Rails に再入門中なのですが、Rails Plugin の練習も兼ねて JSON Schema でパラメータをバリデーションをする gem を作ってみました。
https://github.com/kotas/json_schema_rails
https://rubygems.org/gems/json_schema_rails
今運用中のサービス(非 Rails)では JSON Schema でのバリデーションを自作していましたが、Rails4 でクライアントサイドバリデーションをやろうとすると、今のところデファクトな選択肢がないっぽく(Rails3 までは client_side_validations がメジャーだったようですが開発終了っぽいし)、リアルタイムバリデーションどうすっか、となって移植してみたのです。
こんな感じの YAML を app/schemas/posts/create.yml
に書いて
--- "$schema": "http://json-schema.org/draft-04/schema#" title: Create Post type: object required: - post properties: post: type: object additionalProperties: false required: - title - body properties: title: type: string body: type: string
Controller 側で
class PostsController < ApplicationController # Validate requests for all actions in this controller validate_schema def create end def update end end
みたいな感じで書くと自動的にパラメータがバリデーションされます。
モデル側に書くのも考えたのですが、Rails4 からは Strong Parameter で Controller 側にパラメータ検証を移しつつあるっぽいので、いっそこんな感じに。
他にも
などが付属します。
JSON Schema を使うメリットとして、
- バリデートするためのライブラリがどの言語でも大抵すでにある
- JavaScript でもそのまま使えるので、クライアントサイドとサーバサイドで同じバリデーションが DRY に出来る
- 仕様が複雑すぎず、シンプルすぎない
などがあり便利です。
Rails はほぼ初心者な状態なので、何かツッコミあればビシバシどうぞ><