06 コントローラー - ohr486/elixir_handson_demo2 GitHub Wiki

06-コントローラー

コントローラーのソースコードは、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関数の引数の、connparamsは以下のような値が入ります。

  • 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引数のconnhello関数の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関数から呼び出されるビュー/テンプレートについて見ていきましょう。

NEXT:07-ビュー

⚠️ **GitHub.com Fallback** ⚠️