T time

プログラミングや電子工作、各種ガジェットに関するブログです。

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 については以下の記事を参照してください。

taturou.hatenablog.com

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 chromeFirefoxSafariなど)で http://localhost:2300 にアクセスしてみてください。 このように表示されたら成功です。

f:id:tatur0u:20150621003944p:plain

コード説明

では 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 doend の中でアプリケーションの設定を行います。

今回はルーティング設定だけ実施しています。 http://localhost:2300/ にアクセスがあると、home#index を呼び出します *1

module Controllers::Home

コントローラーです。 コントローラはモジュールとして作ります。

モジュール名は Controllers とします。

その中に Home モジュールと Index クラスを作成します。 これはルーティング情報 home#index と同じ名前です(先頭は大文字)。

ここで注意するのは、Lotus::Controller クラスの派生クラスではない、ということです。 必要な機能は include で取り込みます。 それにより最低限の機能だけを取り込むことができます。 OneFile::ControllerOneFile::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 の仕組みです(参考文献を参照)。

コード

今回作ったアプリケーションの全ファイルは、以下から入手できます。

github.com

あとがき

今回は、Lotus を使った一番単純なアプリケーションを作成しました。 まぁ、アプリケーションとも呼べないシロモノですが、なんとなく Lotus の基本を垣間見れたでしょうか。

次回は、Controller から View で表示する情報をコントロールするサンプルを紹介します。

参考文献

qiita.com

*1:ただしhomeクラスのindexメソッドではないく、homeモジュールの indexクラスとなります。

*2:'/?foo=bar' なら params['foo'] に 'bar' が入ってきます。