06 コントローラー - ohr486/elixir_handson_demo2 GitHub Wiki
コントローラーのソースコードは、lib/demo_web/controllers
の中に配置します。
コントローラーはモジュールとして実装し、ルーティングで指定した関数をモジュール内で定義する必要があります。
今回は、HelloController
というモジュールで、その中にhello
という関数が実装されていれば良いので、
そのようにlib/demo_web/controllers/hello_controller.ex
を作成しましょう。
# lib/demo_web/controllers/hello_controller.ex
defmodule DemoWeb.HelloController do
use DemoWeb, :controller # コントローラー関連の機能を使うための指定
def hello(conn, params) do
# viewの表示の処理(後ほど実装)
end
end
モジュール名が、HelloController
ではなくDemoWeb.HelloController
なのに注意してください。
これは、ルーティングで指定した時にscopeがDemoWeb
だったので、ネームスペースとしてDemoWeb
を持つコントローラーでなければならないからです。
なお、Elixirのモジュールのネームスペースに関して、ドット(.)はモジュールの入れ子を表現します。 ですので、以下の2つの定義は全く同じ意味になります。
defmodule Hoo do
defmodule Bar do
def hello do
end
end
end
defmodule Hoo.Bar do
def hello do
end
end
use DemoWeb, :controller
がモジュールの先頭で宣言されていますが、
これはPhoenixのコントローラー関連の機能を使うための指定です。
コントローラーモジュールは必ずこの宣言を行う必要があります。
また、hello関数の引数の、conn
とparams
は以下のような値が入ります。
- conn : コネクションの構造体、通信接続情報がここの中に含まれる。後述するrender関数の引数として受け渡す
- params : 画面表示時のURLパラメータなどの情報が含まれる、今回はnameというパラメータに名前を設定するので、ここからnameに指定された名前を取得して描画する
それでは、hello関数を以下の様に実装していきましょう。
- nameパラメータに指定した名前を取得する
- 取得した名前を使って「こんにちは、<名前>」と画面に表示する
URLパラメータの情報は、params
に入っています。
params
はマップなので、params[<キー名>]
としてマップに含まれるキーに対応する値が取得できます。
URLパラメータnameの値は、"name"
という文字列のキーになっているので、画面に表示させる名前は
name = params["name"]
とすることで取得できます。また、同時にname
という変数に名前の情報を設定しています。
画面の表示には、render
関数を使います。render
関数はそれぞれ3つの引数をとります。
- 第1引数: conn(hello関数の1つ目の引数で受け取った値をそのまま受け渡す)
- 第2引数: テンプレート名
- 第3引数: テンプレートに渡す値を表すマップ
第1引数のconn
はhello
関数のconn
をそのまま受け渡せばOKです。
第2引数は、次の07-ビューで作成するテンプレートファイルの名前を指定します。
次節でhello.html
というテンプレートを作成するとして、"hello.html"
を指定します。
第3引数はテンプレートは値を受け取ることができるので、そこで指定するキーを持つマップを指定します。
最終的に表示される画面にname
というURLパラメータで指定された名前を表示させたいので、
名前を取得で取得した名前(が代入されたname)を値に持つマップを指定すれば良いです。
キーをwho
とすると、
%{:who => name}
または、
%{who: name}
と書くことができます。
最終的にモジュールは、この様な実装になります。
defmodule DemoWeb.HelloController do
use DemoWeb, :controller
def hello(conn, params) do
name = params["name"]
render(conn, "hello.html", %{who: name})
end
end
次に、render
関数から呼び出されるビュー/テンプレートについて見ていきましょう。