ruby 書いたり heroku に deploy したりした
久しぶりに ruby ( sinatra ) を書いてみてそのアプリを今更 heroku に deploy してみた。
以下ハマったところとか。
なんか
shotgun がオワコンになってた........- 最近は sinatra-reloader の方がいいのかな ?
- warden にハマった............
- 結局 omniauth だけでやった。
session 周り
sinatra ? のデフォルトのセッションはクッキーに書かれていたので後ろの何かしらのストアに入れたいなぁと思った。
heroku で使えそうなのを見て memcachier に入れるのがいいかなぁという感じだった
require 'rack/session/dalli' require 'dalli' require 'memcachier' use Rack::Session::Dalli, :cache => Dalli::Client.new, :expire_after => 60 * 60 * 24 * 3
という感じで書いた。
Rack::Session::Dalli が割りとよしなに設定を入れてくれちゃうのと、 memcachier を使う場合 heroku 側で MEMCACHIER_PASSWORD, MEMCACHIER_SERVERS, MEMCACHIER_USERNAME という環境変数に入れられるので、
require 'memcachier' した上で Rack::Session::Dalli のバックエンドを明示的に Dalli::Client.new を渡すようにした。
これで、memcachier が Dalli::Client がデフォルトで読み込む環境変数を定義してくれる
twitter とか tumblr の api 叩くのに
TWITTER_CONSUMER_KEY = ENV["TWITTER_CONSUMER_KEY"] TWITTER_CONSUMER_SECRET_KEY = ENV["TWITTER_CONSUMER_SECRET_KEY"] TUMBLR_CONSUMER_KEY = ENV["TUMBLR_CONSUMER_KEY"] TUMBLR_CONSUMER_SECRET_KEY = ENV["TUMBLR_CONSUMER_SECRET_KEY"] Twitter.configure do |config| config.consumer_key = TWITTER_CONSUMER_KEY config.consumer_secret = TWITTER_CONSUMER_SECRET_KEY end Tumblife.configure do |config| config.consumer_key = TUMBLR_CONSUMER_KEY config.consumer_secret = TUMBLR_CONSUMER_SECRET_KEY end
てな感じで consumer_key は先に入れて
Twitter::Client.new( :oauth_token => twitter_access_token, :oauth_token_secret => twitter_access_token_secret, )
みたいな感じでやった。
tumblr は tumblife が良さそうだった。
sinatra から触る session 周り
session[...] を sinatra 側で触ると 2 個しかアクションがないサイトでも気持ち悪くてどうしたものかなーと思ったので
before do @user = User.new(session) end get '/' do @user.is_login? end
みたいな感じでラップするといいかなと思った。サンプルだとちょくで触ってるのとかが多いように感じたけど、他の人はどうしてるのだろう ?
heroku 周り
foreman で heroku 上で動かすのは Procfile に書いて、手元では memcached とかも立ち上げるので Procfile.dev というのを作った。
foreman start -f Procfile.dev
手元では、heroku 上に定義している環境変数がないので .env にてろてろと書いて、.gitignore に追加した。
なんか
ruby わかってるとよしなに動くし気持ちいしかっこいいけど、はまると気になって色んなところ調べるとここよしなすぎだろ〜みたいな感じがするのとメンテされてない gem に遭遇する確率が高い気がする。
けど、色々試行錯誤して、自分では腑に落ちるところまで考えたり出来たので良かった。