T time

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

LotusでOne-file-applicationを作る(3) - ControllerからViewへデータを渡す

前回は、コントローラからビューにデータを渡す方法を紹介しました。

今回は、ルーティング情報を追加し、そのパスを表示してみたいと思います。

今回のゴール

http://localhost:2300/hello にアクセスすると、そのパスを表示します。

Webブラウザで以下のように表示されます。

f:id:tatur0u:20150622231156p:plain

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つの処理です。

  1. routes.path(:hello)
  2. routes.url(:hello)

routes はコントローラで expose したオブジェクト。 :hello はルーティング情報でつけた名前です。

この式は、それぞれアプリケーションのルートからの相対パスと、ホスト名を含む絶対パスを返します。 今回の場合は:

  1. "/hello"
  2. "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> という文字列を返すと &lt;p&gt;foo&lt;/p&gt; に変換されます。

そのため、HTML 自体を生成するときは _raw を介して文字列が変換されないようにします。

コード

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

github.com

あとがき

今回は、ルーティング情報を追加する方法と、それを元にパスを生成する方法を見ました。
おさらいです。

  • ルーティング情報には as を使用して名前をつけることができる。
  • ビューでルーティング情報を使う場合は、コントローラで expose :routes する。
  • routes.path(:名前)routes.url(:名前) は、"名前"へのパスを出力する。
  • render でHTMLを返すときは _raw を付ける。

次回は、テンプレートを使用する方法を紹介します。