sinatraで色々やってみたメモ

110
_110365
Published in
4 min readApr 14, 2020

HTMLとjsで作ってた簡易ツールにサーバーサイドの処理を加えたかったので、sinatraに載せ替えてます。
どうやったらいいかわからないことが結構多かったので、詰まったところと解決法をメモります。

ファイルを分けたい・コンソールでデバッグしたい

メインファイルのapp.rbはコントローラ的な感じで使い、Twitter APIを叩く処理は別ファイルにしたかったので、ディレクトリ構成をこうした。

lib/twitter.rb
app.rb
(他のファイルは略)

rails consoleみたいに、irbからTwitter.newとか実行したかったけれど
irb(irb -r ‘./app.rb’)で起動してもuninitialized constantになってしまいうまく行かず。
ちなみにapp.rb内でちゃんと require ‘./lib/twitter’ してある。

解決法:
以下のQiita記事を参考に
(1) racksh のgemをインストール (bundle exec rackshでコンソール起動)
(2) config.ruでlibディレクトリ以下をrequireするように設定
したらやりたいことは実現できた。2はあんまり関係ないかも。

# config.ru
# lib以下rbファイルを読み込む
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each { |f| require f }

参考:https://qiita.com/Alt0/items/3965b4a9889698579df4

環境変数をdotenvで読み出したい

TwitterのAPIキーを.envファイルに記述したので、読み出せるようにしたい。しかしrequire ‘dotenv’ しても環境変数の値が読めずnilになってしまう。

解決法:
requireするモジュールが違った。dotenv/loadをrequireすればOK。

# .envの内容が読まれない
require 'dotenv'
p ENV["HOGE"] #=> nil
# こっちが正解
require 'dotenv/load'
p ENV["HOGE"] #=> "hogehoge"

メインのファイルをクラスで囲いたい(なんとなく)

http://sinatrarb.com/intro-ja.html に書いてある通り、
gem install sinatraして、以下のような内容のrbファイルを作って、
ruby app.rb を実行するだけでブラウザ表示までできちゃうお手軽さ。

# app.rbrequire 'sinatra'get '/' do
# なんかかく
end

けど、なんとなくこのget ‘/’ do~endをこのまま書くのが落ち着かない。
railsばっかり触ってるから?ruby的には気にならないものなのだろうか。

まぁなんとなく落ち着かないので囲って書いてみた。
やってみてからわかったけれど、モジュラースタイルというやつらしい。

↓詳細はこちら。

Sinatraのクラスを継承したサブクラスを作ればOK。
Sinatra::Baseを継承すると、いろんな機能がデフォルトでオフ状態で
Sinatra::Applicationを継承するとほぼトップレベルに書いたのと機能は同じになるとのこと。感覚的にはまだわかってない。使い分けどきがあるんだろう。

# app.rbrequire 'sinatra'class Furikake < Sinatra::Application
get '/' do
# なんかかく
end
end

(Furikakeってのは作ってるサービスの名前です。)

ただこの場合、config.ruを変える必要があった。

# config.ru
require 'bundler/setup'
Bundler.require
require './app.rb'
run Sinatra::Application # ここを変更

最後の行を

run Furikake # さっきのクラス名

に変更したら元の挙動と同じになった。

ちょこっと感想

sinatra楽しい。Rubyについて分からない部分の整理にもなってよかった。

--

--