LoginSignup
7
1

More than 5 years have passed since last update.

sinatra-paramの紹介

Last updated at Posted at 2018-03-23

はじめに

外国人の@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

最後に

コードはきれいに書けるし、定義もできるところはいいと思います。
みなさんは是非使ってみてください。

参考

sinatra-param

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1