LotusでOne-file-applicationを作る
前回 は Lotus を紹介しました。
今回はそれを使って One-file-application を作ってみましょう。
Lotus での One-file-application の作り方は、以下のブログに素晴らしい記事があります。
Ruby LotusでWeb Appを作ってみる | kim hirokuni
しかし、この記事は使用している Lotus 自体が古く、最新の Lotus では動作しません。 そこで、最新の Lotus 0.3.2 で動作するサンプルを紹介していきます。
なお、この記事は Ubuntu 15.04 で動作確認していますが、その他の Linux ディストリビューションや、OS X でも同様の手順で実行できるはずです。
フォルダ構成
今から作るアプリケーションは、以下のようなフォルダ構成となります。
$ tree -a -L 2 lotus_onefile lotus_onefile/ ├── .bundle/ │ ├── config │ └── ruby/ ├── .lotusrc ├── .ruby-version ├── Gemfile ├── Gemfile.lock └── config.ru
アプリケーションフォルダ作成
まずはソースコードなどを入れるフォルダを作成します。 シェルから以下を実行します。
$ mkdir lotus_onfile $ cd lotus_onfile/
Ruby インストール
Lotus は Ruby のバージョンにかかわらず使用することが出来ます。 お好きなバージョンを使ってください。 今回は ruby 2.2.2 を使用します。 rbenv でこのアプリケーションの ruby バージョンを固定します。
$ rbenv local 2.2.2 $ ruby -v ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
rbenv については以下の記事を参照してください。
Lotus インストール
Lotus は gem として配布されています。 開発中の最新版は github にありますが今回は gem でインストールしてみます。
$ bundle init
これで空の Gemfile が出来たので、そこに lotus を追加します。 Gemfile を以下のように修正してください。
修正したら以下を実行してください。必要な gem がインストールされます。
$ bundle install --path .bundle
--path <インストールパス>
とすることで、他のアプリケーションに影響を与えず gem をインストールすることができます。
アプリケーション作成
それではアプリケーションを作っていきましょう。
Lotus は Rack アプリケーションなので、まずは configu.ru を作ります。 というか今回のアプリケーションは One-file なので config.ru に全てを書きます。
まずはできあがったものを見てみましょう。
ちょっと長いですが、あとで順番に説明していきます。
動作確認
まずはできあがったアプリケーションが動くところを見てみましょう。 シェルで以下を実行してください。
$ bundle exec lotus server [2015-06-22 00:00:00] INFO WEBrick 1.3.1 [2015-06-22 00:00:00] INFO ruby 2.2.2 (2015-04-13) [x86_64-linux] [2015-06-22 00:00:00] INFO WEBrick::HTTPServer#start: pid=8020 port=2300
このように表示されたら成功です。
このコマンドは終了しません。このまま待機しています。
強制終了は Ctrl+c
です。
lotus server
を実行すると、Webサーバとして WEBrick が起動し、ポート2300番で待ち受けます。
Webブラウザ(Google chrome、Firefox、Safariなど)で http://localhost:2300
にアクセスしてみてください。
このように表示されたら成功です。
コード説明
では configu.ru
について説明していきます。
require 'lotusrb'
lotus は複数モジュールから構成されていますが('lotus/view' など)、単に lotsrb
をrequireするとそれら一式がロードされます。
module ::OneFile
アプリケーション自体のモジュールを作成します。
この例だと ::OneFile
としましたが、これはどのような名前でも付けることができます。
なお OneFile
ではなく ::OneFile
としているのは、Shotgun という gem が動いているためです。
Shotgun はアプリケーションが呼ばれたときに、自動的に最新のコードをロードするためのものです。
これを使うと、Webサーバ(WEBrick)を起動したままコードを修正しても、Webサーバを再起動する必要がありません。
開発中はとても便利な gem です。
ただし、Shotgun を使用するとアプリケーション全体が Shotgun モジュールの中に閉じ込められてしまいます。
そうすると他から OneFile
モジュールが見えなくなるため、::OneFile
としています。
class Application
アプリケーションの本体となるクラスです。
Lotus::Application
の派生クラスとして定義します。
configure do
〜end
の中でアプリケーションの設定を行います。
今回はルーティング設定だけ実施しています。
http://localhost:2300/
にアクセスがあると、home#index
を呼び出します
*1。
module Controllers::Home
コントローラーです。 コントローラはモジュールとして作ります。
モジュール名は Controllers
とします。
その中に Home
モジュールと Index
クラスを作成します。
これはルーティング情報 home#index
と同じ名前です(先頭は大文字)。
ここで注意するのは、Lotus::Controller
クラスの派生クラスではない、ということです。
必要な機能は include
で取り込みます。
それにより最低限の機能だけを取り込むことができます。
OneFile::Controller
と OneFile::Action
モジュールは、Lotus::Application により人知れず動的に作成されています。
Index クラスには、必ず call
メソッドを作成します。
これは Rack の call です。
ユーザからの入力を受けるためのメソッドです。
パラメータには URLクエリ がHashで入ってきます
*2。
module Views::Home
ビューで ビューもモジュールとして作ります。
モジュール名は Views
とします。
その中にはコントローラと同様に、 Home
モジュールと Index
クラスを作成します。
render
メソッドは、ユーザに表示する情報を作成するためのメソッドです。
デフォルトでは HTML を出力することになっており、このメソッドが返した文字列が <body></body>
の中身となります。
なお、前回は「静的な情報はTemplateで表示する」と説明しましたが、今回の例ではTemplateは使っていません。
run
Application を run
により起動します。
これも Rack の仕組みです(参考文献を参照)。
コード
今回作ったアプリケーションの全ファイルは、以下から入手できます。
あとがき
今回は、Lotus を使った一番単純なアプリケーションを作成しました。 まぁ、アプリケーションとも呼べないシロモノですが、なんとなく Lotus の基本を垣間見れたでしょうか。
次回は、Controller から View で表示する情報をコントロールするサンプルを紹介します。