LoginSignup
3
2

More than 5 years have passed since last update.

phoenixのサンプルに画面を追加する

Posted at

※本記事は、基本的に公式ページを試し、まとめた内容となっています。
*今回の内容は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ページが表示される!

image

※ 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 が画面に表示されていることが確認できた!
image

【補足】テンプレートの構成

web/templates/layout/app.html.eexを参照すると

      <main role="main">
        <%= render @view_module, @view_template, assigns %>
      </main>

という記述がある。
実はこのlayoutが基本的なページレイアウトで、先程追加したページは、基本レイアウトに埋め込まれて表示される部分となっている。

image

【補足】便利な 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

まとめ

前回と今回で、基本的な枠組み作成、画面遷移の定義、作成方法を学ぶことができました。
次回は、ドメイン実装あたりにフォーカスして学べたら良いかなと思います。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2