kotas.tech

こたすの技術的なチラ裏 ( Twitter: @ksaito )

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 がメジャーだったようですが開発終了っぽいし)、リアルタイムバリデーションどうすっか、となって移植してみたのです。

こんな感じの YAMLapp/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 はほぼ初心者な状態なので、何かツッコミあればビシバシどうぞ><