独特言語パイソンのWSGIユーティリティ群、Werkzeugには例外発生時に ウェブコンソールを立ち上げる 機能があるそうな。Fukuoka.rb関係者のパイソニスタにどや顔で自慢され(表現には誇張があります)、「うらやましい〜〜〜〜」と思っていたらRuby(Rack)にも似たような機能があった。
rack-webconsole-pry
(Rubygems.org) はブラウザ上でREPLを立ち上げる機能を提供する。REPLは、おなじみ Pry である。Rackミドルウェアとして設定すれば使えるが、gemで入るバージョンは初期設定ではバグがあり、ちゃんと立ち上がらない……。 このプルリクエスト を参照せよ。
最新版を取ってきても良いが、以下の設定を追記してもよい。
Rack::Webconsole.key_code = [96]
Sinatra で試してみる。
source :rubygems
gem 'pry'
gem 'rack-webconsole-pry'
gem 'sinatra'
require 'bundler'
Bundler.setup
require 'sinatra'
require 'rack-webconsole'
require 'cgi'
configure :development do
use Rack::Webconsole
Rack::Webconsole.inject_jquery = true
Rack::Webconsole.key_code = [96]
end
get '/' do
@foo_value = settings.foo_value rescue nil
erb <<EOT
<!DOCTYPE html>
<html>
<head><title>Rack::Webconsole sample</title></head>
<body>
<h1>Rack::Webconsole sample</h1>
<pre style="font-family: Courier, monospace;">
This is a sample app for Rack::Webconsole
Please type ` (backquote) and in the web terminal,
try the command below:
Sinatra::Application.set :foo_value, "Some Text"
and then reload me...
<strong>settings.foo_value = <%= CGI.escapeHTML @foo_value.inspect %></strong>
You even can add routes by sinatra verb!
</pre>
</body>
</html>
EOT
bundle install
ruby app.rb
in http://localhost:4567
「`」(バッククオート)を押すとコンソールが出現する。
試しに、表示されている通り以下の内容をコンソールに入れてみる。
Sinatra::Application.set :foo_value, "Some Text"
リロードすると、Sinatraのsettingの値が変更されていることが分かる。
また、以下のように入力してみる。Routingの追加。
Sinatra::Application.get('/hello') { "Say hello" }
http://localhost:4567/hello
にアクセスすると、確かにページが追加されている!
注意点
この通り、アプリケーションの状態まで動的に変更できて超凄いので、うっかり productionで有効にしないように 気をつけましょう!
Rails ではdevelopmentでないと有効にならないようになっていますが、Sinatraなどの場合は特に要注意です。configure :development do ~ end
ブロックで設定するようにしましょう。
[PR]そんな強力なPryについてもっと知りたいあなたは
WEb+DB Press vol.71 に、Pryのことについて書きましたので是非ご一読ください!
と言いつつ、実は紙幅とテーマの関係で rack-webconsole-pry
に割いた文字数は少ないので、Qiitaでフォローアップの記事を書いてみました。上記と同じようなコードは サポートページ から落とせます。記事自体は、基本的なところから拡張についてまで一通り書いています。是非、感想を聞かせてくださいね〜。