LotusでOne-file-applicationを作る(3) - ControllerからViewへデータを渡す
前回は、コントローラからビューにデータを渡す方法を紹介しました。
今回は、ルーティング情報を追加し、そのパスを表示してみたいと思います。
今回のゴール
http://localhost:2300/hello
にアクセスすると、そのパスを表示します。
Webブラウザで以下のように表示されます。
configu.ru
まずは今回作成するコード全体を見てみましょう。 今回も全てのコードは config.ru に書かれています。
前回と比較して、全体的にコードが足されています。 では、それぞれ説明していきます。
routes
まずはルーティング情報です。
get '/hello', to: 'home#hello'
は良いですね。
ユーザが /hello
にアクセスすると home#hello
が呼ばれます。
次の as: :hello
は何でしょう。
as
はこのルーティング情報に名前を付ける命令です。
このルーティング情報にプログラムからアクセスする場合、'hello' の名前でアクセスすることができます。
どのように使うかはビューで説明します。
Controllers::Hello
次はコントローラーです。 コントローラーはビューで表示するデータを作成するものなので、ここでルーティング情報を作っているはずです。
expose :routes
しているだけですね…。
routes
はルーティングオブジェクトです。
この変数を通じて全てのルーティング情報にアクセスできます。
この変数は call メソッドで @routes
を作成していませんが何を expose しているのでしょう。
実はこれは Lotus::Application が動的に生成したものです。OneFile::Action
を include することでアクセスできます。
Views::Hello
それではビューでルーティング情報を表示してみましょう。
ここで重要なのは以下の2つの処理です。
- routes.path(:hello)
- routes.url(:hello)
routes
はコントローラで expose したオブジェクト。
:hello
はルーティング情報でつけた名前です。
この式は、それぞれアプリケーションのルートからの相対パスと、ホスト名を含む絶対パスを返します。 今回の場合は:
- "/hello"
- "http://localhost:2300/hello"
となります。
たとえば、アプリケーションのトップページからこのページへのリンクを貼る場合は
"<a href='#{routes.path(:hello)}'>Go to Hello</a>"
とするわけです。
ちなみに routes.url()
が http://localhost:2300
となるのは、デフォルトのホスト名として 'localhost' が設定されているからです。
これは設定可能です。
ためしに configure
で以下のように host
を設定してみてください。
configure do host 'sample.com' ...
routes.url(:hello)
の出力は http://sample.com:2300/hello
になると思います。
このように、実際にWebアプリケーションを運用する場合は、取得したドメインを host
で設定します。
_raw
render
の戻り値は _raw html
となっていますが、これは何でしょう。
これは、戻り値をそのまま出力するための命令です。
render はビューが表示するコンテンツを出力するためのメソッドですが、
render が出力するコンテンツはデフォルトで html
と設定されています。
そのため、render が返す文字列はWebブラウザからそのまま見えるように変換されます。
例えば <p>foo</p>
という文字列を返すと <p>foo</p>
に変換されます。
そのため、HTML 自体を生成するときは _raw
を介して文字列が変換されないようにします。
コード
今回作ったアプリケーションの全ファイルは、以下から入手できます。
あとがき
今回は、ルーティング情報を追加する方法と、それを元にパスを生成する方法を見ました。
おさらいです。
- ルーティング情報には
as
を使用して名前をつけることができる。 - ビューでルーティング情報を使う場合は、コントローラで
expose :routes
する。 routes.path(:名前)
、routes.url(:名前)
は、"名前"へのパスを出力する。- render でHTMLを返すときは
_raw
を付ける。
次回は、テンプレートを使用する方法を紹介します。