id:onk さんのMount Engineの記事読んだら便利そうだったのでやってみた。
Railsプロジェクトの作成
まずおもむろにGitHubリポジトリをつくり
rbenv local
bundle install --path=vendor/bundle
bundle exec rails new .
等の儀式を済ませる。
差分は下記の通り。
[diff]Create a Rails project
welcome controller
というHello World的なControllerとViewを作る
[diff]Create a Rails controller
[diff]Create a Rails view
bundle exec rake routes
の結果はこんな感じ
[mazgi@Balmung] $ bundle exec rake routes
Prefix Verb URI Pattern Controller#Action
root GET / welcome#index
Welcome!と表示された。
Mount Engineを試す
記事を参考にconfig/routes.rb
に
mount proc {|env| [200, {}, ["Hello from mounted engine!"]] }, at: "hello_mount_engine"
の1行を書き加えてみる。
[diff]Add mount
to routes
routeが増えた。
[mazgi@Balmung] $ bundle exec rake routes
Prefix Verb URI Pattern Controller#Action
root GET / welcome#index
/hello_mount_engine #<Proc:0x007f138f7872c0@/home/mazgi/Creations/MountableEngineTestDrive/config/routes.rb:4>
/hello_mount_engine
というpathでちゃんと表示された。
Sinatraアプリをマウントしてみる
まずとても簡単なSinatraアプリを作る。
内容はこれだけ:
[mazgi@Balmung] $ < lib/sinatra_app/app.rb
require 'sinatra/base'
class HelloFromSinatra < Sinatra::Base
set :bind, '0.0.0.0'
get "/" do
"I am Sinatra!"
end
get "/hello" do
"Hello from Sinatra!"
end
run! if app_file == $0
end
[diff]Create a Sinatra App
まずは単体でbundle exec ruby lib/sinatra_app/app.rb -e production
する。
'/'と'/hello'はそれぞれ次のように表示される。
ではいよいよSinatraアプリをRailsアプリにマウントしてみる。
まずconfig/application.rb
に
require Rails.root.join("lib/sinatra_app/app")
の1行を追加し、次にconfig/routes.rb
にSinatraアプリをmount
する。
mount HelloFromSinatra, at: "hello_sinatra"
[diff]Add mount
for Sinatra app to routes
bundle exec rake routes
の出力が増えている。
[mazgi@Balmung] $ bundle exec rake routes
Prefix Verb URI Pattern Controller#Action
root GET / welcome#index
/hello_mount_engine #<Proc:0x007fb0335f85a8@/home/mazgi/Creations/MountableEngineTestDrive/config/routes.rb:4>
hello_from_sinatra /hello_sinatra HelloFromSinatra
簡単にRailsアプリからSinatraアプリを呼び出せた。
Mount Engine便利っぽいしドリコム Advent Calendar 2014勉強になる。