※本記事は、基本的に公式ページを試し、まとめた内容となっています。
*今回の内容はgitにあります。
目的
前回作成したサンプルに、ページを新たに追加する方法をまとめる。
ページの追加方法
1.新ページのパス設定を追加
編集ファイル: web/router.ex
scope "/", HelloPhoenix do
pipe_through :browser # Use the default browser stack
get "/", PageController, :index
get "/hello", HelloController, :index ←追加した行
end
# ※追加した行の説明
#
# get がHTTPリクエストメソッド
# "/hello" がパス
# HelloController が /hello へ来たアクセスを処理するエンドポイント
# :index が HelloController のどの関数と紐付けるかを表現
2.HelloControllerを作成
作成ファイル: web/controllers/hello_controller.ex
defmodule HelloPhoenix.HelloController do
use HelloPhoenix.Web, :controller
def index(conn, _params) do
render conn, "index.html"
end
end
3.HelloControllerに対応する viewクラスを定義
作成ファイル: web/views/hello_view.ex
defmodule HelloPhoenix.HelloView do
use HelloPhoenix.Web, :view
end
※ コントローラのファイル名の _
で区切った前方が一致している必要がある。
今回のケースだと「hello_」の部分が一致していないとだめ。
web/controllers/hello_controller.ex
web/views/hello_view.ex
4.実際に描画するhtmlファイルを用意
作成ファイル:web/templates/hello/index.html.eex
<div class="jumbotron">
<h2>Hello World, from Phoenix!</h2>
</div>
※htmlファイルの場合も、templatesの下に掘るフォルダは hello で統一。
5. http://localhost:4000/hello にアクセスすると、その時点で helloページが表示される!
※ webディレクトリ配下はサーバの再起動無しに勝手にコンパイルされる。
パラメータを受け取るページの追加
1.新ページのパス設定を追加
scope "/", HelloPhoenix do
pipe_through :browser # Use the default browser stack
get "/", PageController, :index
get "/hello", HelloController, :index
get "/hello/:messenger", HelloController, :show ←追加行
end
:messenger が入ったパス定義を追加し、 HelloControllerの showメソッドに紐付けた。
2.HelloController に showメソッドを定義
編集ファイル:web/controllers/hello_controller.ex
def show(conn, %{"messenger" => messenger}) do
render conn, "show.html", messenger: messenger
end
showの第二引数がパラメータを受け取るよう定義された。
描画するページは show.html
と定義した。
3.描画するページを作成
作成ファイル: web/templates/hello/show.html.eex
<div class="jumbotron">
<h2>Hello World, from <%= @messenger %>!</h2>
</div>
<%= @messenger %> という定義があるが、これは先程のパラメータ messengerを参照して表示するという内容となっている。
4.http://localhost:4000/hello/Hoge にアクセス
パスパラメータとして設定した Hoge
が画面に表示されていることが確認できた!
【補足】テンプレートの構成
web/templates/layout/app.html.eex
を参照すると
<main role="main">
<%= render @view_module, @view_template, assigns %>
</main>
という記述がある。
実はこのlayoutが基本的なページレイアウトで、先程追加したページは、基本レイアウトに埋め込まれて表示される部分となっている。
【補足】便利な router定義 resources
ユーザの登録・一覧・編集・削除を提供するアプリを作成する場合、上記のような定義だと一つ一つコントローラ定義をしないといけない...と思いきや
で示される resources を使うと
scope "/", HelloPhoenix do
pipe_through :browser # Use the default browser stack
get "/", PageController, :index
resources "/users", UserController ←追加行
end
と定義するだけで、下記のコントローラ定義をしたことになる!楽ちん!
user_path GET /users HelloPhoenix.UserController :index
user_path GET /users/:id/edit HelloPhoenix.UserController :edit
user_path GET /users/new HelloPhoenix.UserController :new
user_path GET /users/:id HelloPhoenix.UserController :show
user_path POST /users HelloPhoenix.UserController :create
user_path PATCH /users/:id HelloPhoenix.UserController :update
PUT /users/:id HelloPhoenix.UserController :update
user_path DELETE /users/:id HelloPhoenix.UserController :delete
resourcesはネスト定義できます。
想像どおりかと思いますが、
resources "/users", UserController do
resources "/posts", PostController
end
と /posts
のr resources定義を加えると、以下のようなパスで定義できます。
user_post_path GET users/:user_id/posts HelloPhoenix.PostController :index
user_post_path GET users/:user_id/posts/:id/edit HelloPhoenix.PostController :edit
user_post_path GET users/:user_id/posts/new HelloPhoenix.PostController :new
user_post_path GET users/:user_id/posts/:id HelloPhoenix.PostController :show
user_post_path POST users/:user_id/posts HelloPhoenix.PostController :create
user_post_path PATCH users/:user_id/posts/:id HelloPhoenix.PostController :update
PUT users/:user_id/posts/:id HelloPhoenix.PostController :update
user_post_path DELETE users/:user_id/posts/:id HelloPhoenix.PostController :delete
まとめ
前回と今回で、基本的な枠組み作成、画面遷移の定義、作成方法を学ぶことができました。
次回は、ドメイン実装あたりにフォーカスして学べたら良いかなと思います。