Elixir + Phonenix でWebアプリ作る時の基本まとめ:scaffoldぽいやつで最初のコントローラ、モデル、ビューを作る
今回含めてこれまでの目次
Elixir + Phonenix でWebアプリ作る時の基本まとめ
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
だ。
初期状態のルーターは以下のようになっていると思う(コメントは消してます)。
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
私が今回関心があるのは上記ファイルの内の以下の部分。
scope "/", KuronekoWeb do
pipe_through :browser
get "/", PageController, :index
end
ここに先程作った MagazineController
へのルートを追加する。
scope "/", KuronekoWeb do
pipe_through :browser
get "/", PageController, :index
resources "/magazines", MagazineController
end
これでルートの設定は完了。
修正したKuronekoアプリの起動
$ mix phx.server
それでは以下にアクセスしてみよう。
こんな感じのページが表示されただろうか。
表示されたら、 'New Magazine'をクリックして新しいアイテムを追加してみる。
追加したら編集や削除もしてみよう。
たったこれだけでリソースに対する一連の操作が実装できた...というのは10年も前にRailsで体験済みだけど、やはり楽ちんですね。
実際のアプリを作るときにどれだけこのScaffold的なやつを使うのかはわからないけど、てかあんまり使わんかもだけど、生成されたコントローラやモデルを見ると、どういう書き方をするのか勉強になるし、とりあえずテンプレート的に生成しておいて、それを修正しながら作っていくのも人によってはやりやすいんじゃないかと思う。
問題なければ今日はここまで。お疲れ様でした。
Discussion