はじめに
外国人の@rueyjyeです。
研修の時にSinatraを使って、REST APIを作りました。
自作のバリデーションを作る時に、大量なif文とか書きました。
コードはきれいじゃないと思った時に、使いやすいgemを見つかりました。
紹介させたいと思います。
sinatra-param
https://github.com/mattt/sinatra-param
sinatra用のgemです。
パラメータを簡単に定義できるライベラリです。
バリデーションもきれいにできると思います。
使い方
とりあえず、インストール
gem install sinatra-param
sinatraのサンプルコード
sample.rb
require 'sinatra/base'
require 'sinatra/param'
require 'json'
class App < Sinatra::Base
helpers Sinatra::Param
before do
content_type :json
end
get '/search' do
# ここからパラメータを定義します
# 型、必須、デフォルト、正規化とか設定できます
param :q, String, required: true
param :categories, Array
param :sort, String, default: "title"
param :order, String, in: ["ASC", "DESC"], transform: :upcase, default: "ASC"
param :price, String, format: /[<\=>]\s*\$\d+/
one_of :q, :categories
{...}.to_json
end
end
これでGETメソッド中のパラメータ定義ができます。
バリデーション
バリデーション失敗したら、デフォルトでstatus 400エラーが返します。
※ Githubドキュメントは各バリデーションの使い方を書いてないけど、ちょっと使った結果は以下です。
・required
param :test, String, required: true
・blank
param :test, String, blank: true
・is
param :test, Integer, is: 10
・in, within, range
param :test, String, in: 'sample'
param :test, Integer, range: 1..5
・min / max
param :test, String, min: 10
・min_length / max_length
param :test, String, min_length: 10
・format
param :test, String, format: /[<\=>]\s*\$\d+/
カスタマイズエラーメッセージ
定義のところもエラーメッセージをカスタマイズできます。
param :test,
format: /regex/,
message: "カスタマイズエラーメッセージ"
Defaults and Transformations
デフォルト値を設定し、計算した結果に変換もできます
param :attribution, String, default: "example"
param :offset, Integer, min: 0, transform: lambda {|n| n - (n % 10)}
One of and Any of
パラメータの数と必須の制限したい時には使いやすい。
One of
3つの中で必ず1つが入力する。3つの中で1つしか存在しない。
param :a, String
param :b, String
param :c, String
one_of :a, :b, :c
結果
a => ok
b => ok
c => ok
a,b => ng
a,c => ng
b,c => ng
a,b,c => ng
Any of
3つの中で必ず最小1つが入力する。
param :a, String
param :b, String
param :c, String
any_of :a, :b, :c
結果
a => ok
b => ok
c => ok
a,b => ok
a,c => ok
b,c => ok
a,b,c => ok
最後に
コードはきれいに書けるし、定義もできるところはいいと思います。
みなさんは是非使ってみてください。