概要
Sinatra の拡張機能の開発入門としてとりあえず動作する拡張を作ってみたいと思います
また今回作成する拡張はヘルパーとして作成します
環境
- macOS 11.6.2
- Ruby 3.0.3p157
- Sinatra 2.1.0
拡張の作成
拡張は Sinatra モジュール配下に作成します
今回はリクエストのヘッダを出力するような拡張にしてみます
- vim test_ext.rb
require 'sinatra/base'
module Sinatra
module LoggingHeader
def hputs
headers = request.env.select { |k, v| k.start_with?('HTTP_') }
logger.info headers
end
end
helpers LoggingHeader
end
LoggingHeader は拡張の名前になります
Sinatra::Base 配下で使用できるオブジェクトなどは拡張配下でも参照することができます
上記で言えば request オブジェクトを参照しています
作成した拡張機能を使う
- vim test.rb
require 'sinatra'
require './test_ext'
get '/' do
hputs
'ok'
end
Sinatra の DSL をそのまま使うのであれば require するだけで拡張用のメソッドが使えるようになっています
クラシックスタイルで拡張を使うのであれば更に helpers Sinatra::LoggingHeader
を記載します
拡張を使う場合はこれだけで OK です
拡張機能開発時にはルールがある
詳細は公式のドキュメントを確認してください
http://sinatrarb.com/extensions.html
Sinatar::Base クラスには直接変更を入れないでくださいやクラシックスタイルでもちゃんと使えるように記載する必要があるなどが書かれています
また今回はヘルパーとして作成しましたが Sinatra の DSL を拡張することもできます
その場合は helper ではなく register として呼び出す必要があるので注意してください
あとは gem として公開する
作成した拡張を公開するのであれば gem として作成してあげる必要があります
ディレクトリ構成などは公式に記載してあります
sinatra-fu
|-- README
|-- LICENSE
|-- Rakefile
|-- lib
| `-- sinatra
| `-- fu.rb
|-- test
| `-- spec_sinatra_fu.rb
`-- sinatra-fu.gemspec
最後に
Sinatra の拡張機能を開発する方法を紹介しました
ルールがあるのでそれだけしっかりと守りましょう
Rubygems で公開する場合はディレクトリ構成なども守りましょう