Phoenixで静的ページレンダリングする方法
Controllerからテンプレートまで、全て手動で作成する方法
routerへの追記
router.ex
ファイルに以下の形式で記述を行う。
形式: get "/URLを記述", 省略Controller, :アクション
例として、get "/sample", SampleContoller, :home
と記述する。
この場合記述したURLでリクエストが送信されると、sample_controller.ex
内のhomeというアクションが実行される。
アクションの定義
アクションは以下のように定義することができる。
def アクション(conn, params) do
...
render(conn, template_or_component)
end
アクションの引数は以下のようなものである。
- conn - リクエスト情報が含まれている。(ここでは割愛)
- params - URLによって渡されたパラメータがMapで格納される。
例えば/greet/:name/
というルートを設定しており、/greet/taro
/というURLにリクエストが送信されると、%{ "name" => "taro"}
という形式でパラメタが格納される。
アクション内では必ずrender関数を実行する必要がある。
render関数
render関数の以下のように呼び出す。
形式: render(conn, template_or_component, options)
この引数の内template_or_component
が指すものはテンプレート、関数コンポーネントである。
当然ながら、それを指定するためには予め定義している必要がある。
なお、テンプレート、関数コンポーネントはアプリレイアウト(もしくはルートレイアウト)の@inner_content
内にレンダリングされる。
レイアウトについては、Phoenixにおけるページレンダリング順についてのメモを参照
テンプレートと関数コンポーネント
テンプレートと関数コンポーネントを作成するために、
それらを定義するHTMLモジュールとディレクトリを作成する必要がある。
まず、.*_html.ex
と/.*_html
を作成する。
.*_html.ex
は次のように記述する。
defmodule 省略 do
use ..., :html
embed_templates "省略_html/*"
embed_templates
は、
テンプレートの構成を設定するために記述している。
embed_templates
で指定したディレクトリ内に、
heexファイルを配置することでテンプレートとして使用できるようになる。
例としてsample_controller.ex
とsample_html.ex
を作成した場合、/sample_html
を作成する。
sample_html.ex
内にembed_templates "sample_html/*"
と記述する。
関数コンポーネントの定義
関数コンポーネントは以下の例のように記述する。
def sample(assigns) do
~H"""
// ここにHTMLを記述する。
<p>function component.</p>
"""
end
テンプレート(または~H
シジル)に
次のように記述して使用する。
形式: <.関数コンポーネント名(引数) />
例: <.sample() />
なお、このモジュール内でrender関数を上書きし、
~H
シジルで表示内容を記述することもできる。
結論
以下の手順を行いテンプレートを表示させる。
-
router.ex
にget
でURLを記述。 -
/controllers
に.*_contoller.ex
という名前のコントローラーファイルを生成。 - アクションの処理を定義する。
-
.*_html.ex
と/.*_html
を作成する。 -
/.*_html
にheexを配置。 -
.*_html.ex
にembed_templates
でディレクトリを指定する。