なにをしたいか
/example
みたいなパス以下のリクエストを根こそぎ処理する。
簡単にマウントしてみる
適当なRailsアプリを作る
$ rails new mount_rack_example
lib
以下をロードするようにする
config/application.rb
module MountRackExample
class Application < Rails::Application
config.autoload_paths += %W(#{config.root}/lib)
end
end
Rackアプリを適当に作る
lib/rack_example.rb
module RackExample
def self.call(env)
p env
[200, {}, ["#{env}"]]
end
end
※ call
メソッドはクラスメソッドで定義しないといけない。
マウントする
config/routes.rb
Rails.application.routes.draw do
mount RackExample, at: '/example'
end
試しに見てみる
$ bundle exec rails s
$ open http://localhost:3000/example
知見
-
env["PATH_INFO"]
には、prefixである/example
が無く、http://localhost:3000/example へのアクセスであると"/"
になる -
mount
メソッドは https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/mapper.rb#L600 にある