Sinatra

Page content

Tips

いろいろ Tips めも

動的に URL を生成するベストプラクティス

調べた感じ:

「Rails だと named routes があるけど Sinatra ではどうルーティングするの?」ごもっともな疑問。「基本的には複雑なことをやらないしそうだよ。やりたかったら自分で view helper 書かないとね。」 - StackOverflow - Correct Way to do Routes in Sinatra Views

Sinatra 1.2 で初めて url helper が出たようだけど、「url helper 以上に難しいことはしないよ、シンプルにやれ」とのこと。 - Sinatra 1.2 release の URL helper の箇所

ということで (多分) ベストプラクティスは、 url helper を使えば 手元の開発環境で rackup したときも、サーバ上にデプロイして サブディレクトリを切ったときも、柔軟に URL を生成できる。 公式ドキュメントはこちらの Generating URLs

  • 例: view にコレを書くと
    <li> <a href=<%= url('/webui/lookup') %>>lookup</a> </li>
    
  • 手元で bundle exec rackup すると http://localhost:9292/webui/lookup へのリンクが作成される
  • サーバ上で passenger で RackBaseURI /secondapp を指定して apache 動かすと http://myserver.example.com/secondapp/webui/lookup へのリンクが生成される。

passenger + apache + sinatra でサーバ上で稼働させる手順

  • 前提:
    • user: george
    • ruby 2.3.3 (rbenv でインストール)
      • gem, bundler も入れる
  1. 動かしたいアプリ myapp を セットアップする
cd ~/
git clone https://somewhere/myapp.git
cd ~/myapp/
bundle install --path=.bundle
  1. apache インストール: 省略
  • welcome.conf とか消そうね
  1. passenger インストール
  gem install passenger
  sudo chmod o+x "/home/george"
  sudo ln -sv ~/myapp/public /var/www/html/myapp
  passenger-install-apache2-module
    -> 実行後、設問はすべてenterを入力, 一部メモ
  1. /etc/httpd/conf.d/passenger.conf を作成する。細かいところは環境に応じて修正してほしいが、 passenger-install-apache2-module の途中でしたメモを活用して作っていく:
  LoadModule passenger_module /home/george/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/passenger-5.2.1/buildout/apache2/mod_passenger.so
  <IfModule mod_passenger.c>
    PassengerRoot /home/george/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/passenger-5.2.1
    PassengerDefaultRuby /home/george/.rbenv/versions/2.3.3/bin/ruby
  </IfModule>

  RackBaseURI /myapp
  RackEnv production
  <Directory /myapp>
    Options ExecCGI FollowSymLinks
    Options -MultiViews
    AllowOverride All
    Order Allow,Deny
    Allow From All
  </Directory>

  # 必要なら Passenger が追加するHTTPヘッダを削除するための設定。
  Header always unset "X-Powered-By"
  Header always unset "X-Rack-Cache"
  Header always unset "X-Content-Digest"
  Header always unset "X-Runtime"

  # 必要ならこの辺も
  PassengerMaxPoolSize 20
  PassengerMaxInstancesPerApp 4
  PassengerPoolIdleTime 3600
  PassengerHighPerformance on
  PassengerStatThrottleRate 10
  1. configtest してから apache 再起動して利用開始
sudo service httpd configtest
sudo service httpd restart

いじょう。