🥾

Elixir + Phonenix でWebアプリ作る時の基本まとめ:scaffoldぽいやつで最初のコントローラ、モデル、ビューを作る

2021/06/23に公開

今回含めてこれまでの目次

Elixir + Phonenix でWebアプリ作る時の基本まとめ

  1. 環境構築
  2. データベースの準備とWebアプリの起動
  3. scaffoldぽいやつで最初のコントローラ、モデル、ビューを作る

Railsのscaffoldみたいなやつで色々生成する

タイトルの通り。PhoenixにもRailsでいうところのscaffoldみたいなやつがあり、コマンド一つでモデル、コントローラ、ビューを作れる。
かつ、コントローラには index, new, create, update, delete が最初から実装されている。

とりあえずやってみよう。今回はBookコンテキストのMagazine(雑誌)モデルを作ってみる。
ちなみにコンテキスト(Book)はアプリを構造化するためのもの、と今のところは理解している。
さらっとBooksだけで指定できると楽なんだけど、それだとちょっとアプリが大きくなったときに名前の衝突とか全体の設計とかで手戻りが発生することもあるし、最初の段階からこれを考えて命名するのは良いんじゃないかと思う。

ではいってみよう。

$ mix phx.gen.html Book Magazine magazines title:string isbn:string:unique count:integer

色々と生成されたが、主なものは

  • モデル: lib/hello/book/magazine.ex
  • コントローラ: lib/hello_web/controllers/magazine_controller.ex
  • HTMLテンプレート: lib/hello_web/templates/magazine/ 以下
  • ビュー: lib/hello_web/views/magazine_view.ex

だろうか。あと、この時点ではテーブルは生成されてなくて、以下のようなファイルが生成されている。
priv/repo/migrations/20210623113326_create_magazines.exs

それでは実際にテーブルを作ってみよう。

$ mix ecto.migrate

疑り深い私は、本当にテーブルが作られたのか見てみる。

psql -U postgres -h localhost kuroneko_dev
Password for user postgres: 

kuroneko_dev=# \d
                List of relations
 Schema |       Name        |   Type   |  Owner   
--------+-------------------+----------+----------
 public | magazines         | table    | postgres
 public | magazines_id_seq  | sequence | postgres
 public | schema_migrations | table    | postgres
(3 rows)

kuroneko_dev=# \q

できてた。疑ってごめんなさい。

ルートの追加

すぐにでもアプリを起動したいところだけど、その前にルートを追加してやらないといけない。
編集するのは lib/kuroneko_web/router.ex だ。
初期状態のルーターは以下のようになっていると思う(コメントは消してます)。

lib/kuroneko_web/router.ex
defmodule KuronekoWeb.Router do
  use KuronekoWeb, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", KuronekoWeb do
    pipe_through :browser

    get "/", PageController, :index
  end

  if Mix.env() in [:dev, :test] do
    import Phoenix.LiveDashboard.Router

    scope "/" do
      pipe_through :browser
      live_dashboard "/dashboard", metrics: KuronekoWeb.Telemetry
    end
  end
end

私が今回関心があるのは上記ファイルの内の以下の部分。

lib/kuroneko_web/router.ex
  scope "/", KuronekoWeb do
    pipe_through :browser

    get "/", PageController, :index
  end

ここに先程作った MagazineController へのルートを追加する。

lib/kuroneko_web/router.ex
  scope "/", KuronekoWeb do
    pipe_through :browser

    get "/", PageController, :index
    resources "/magazines", MagazineController
  end

これでルートの設定は完了。

修正したKuronekoアプリの起動

$ mix phx.server

それでは以下にアクセスしてみよう。
http://localhost:4000/magazines

こんな感じのページが表示されただろうか。

表示されたら、 'New Magazine'をクリックして新しいアイテムを追加してみる。

追加したら編集や削除もしてみよう。

たったこれだけでリソースに対する一連の操作が実装できた...というのは10年も前にRailsで体験済みだけど、やはり楽ちんですね。
実際のアプリを作るときにどれだけこのScaffold的なやつを使うのかはわからないけど、てかあんまり使わんかもだけど、生成されたコントローラやモデルを見ると、どういう書き方をするのか勉強になるし、とりあえずテンプレート的に生成しておいて、それを修正しながら作っていくのも人によってはやりやすいんじゃないかと思う。

問題なければ今日はここまで。お疲れ様でした。

Discussion