fukuoka.ex代表のpiacereです
ご覧いただいて、ありがとうございます
mix phx.gen.jsonで自動生成したAPIのリネームをしたいとき、どこを直す必要があり、直さなくて良いところがどこか、イマイチ分かりにくいので、まとめてみました
前半は、「URL」と「コントローラおよびビューのモジュール名」のリネームです(「API」と前置きしていますが、自動生成したHTMLも、ほぼ同様です)
なお、「Phoenix」は、ElixirのWebフレームワークです
内容が、面白かったり、役に立ったら、「いいね」よろしくお願いします
本コラムの検証環境、事前構築のコマンド
本コラムは、以下環境で検証しています(Windowsで実施していますが、Linuxやmacでも動作する想定です)
- Windows 10
- Elixir 1.8.1 ※最新版のインストール手順はコチラ
- Phoenix 1.4.0 ※最新版のインストール手順はコチラ
- PostgreSQL 10.1 ※最新版のインストール手順はコチラ
また、以下コマンドでPhoenix PJ+JSON APIを構築しています
mix phx.new api_sample --no-webpack
cd api_sample
mix ecto.create
mix phx.gen.json Api Post post title:string body:string
mix ecto.migrate
【手動でルーティング追加とprotect_from_forgery無効化をする】
iex -S mix phx.server
URLを変更するとき
URLを、http://localhost:4000/post
から、http://localhost:4000/hoge
のように変更するときは、router.exの「resource」や「get」等の最初の引数にあるパスを書き換え、コントローラのcreate()関数内で呼ばれているRoutes.xxxx_path()をリネームする必要があります
defmodule ApiSampleWeb.Router do
…
scope "/", ApiSampleWeb do
…
resources "/hoge", PostController, except: [:new, :edit]
# modify here-^
…
defmodule ApiSampleWeb.PostController do
…
def create(conn, %{"post" => post_params}) do
with {:ok, %Post{} = post} <- Api.create_post(post_params) do
conn
|> put_status(:created)
|> put_resp_header("location", Routes.hoge_path(conn, :show, post))
# modify here--------------------------^
|> render("show.json", post: post)
end
end
…
コントローラもしくはビューのモジュール名を変更するとき
コントローラのモジュール名を変更するときは、3つの書き換える対象が出てきます
まずは、router.exの呼び出しているコントローラ名です
defmodule ApiSampleWeb.Router do
…
scope "/", ApiSampleWeb do
…
resources "/post", HogeController, except: [:new, :edit]
# modify here--------^
…
次に、コントローラのモジュール名です
なお、ここではファイル名も変更していますが、必須ではありません(が、変えておいた方が無難です)
defmodule ApiSampleWeb.PostController do
…
defmodule ApiSampleWeb.HogeController do
# modify here---------^
…
それから、ビューのリネームも必要です(こちらも、ファイル名の変更は必須ではありません)
defmodule ApiSampleWeb.PostView do
use ApiSampleWeb, :view
alias ApiSampleWeb.PostView
…
defmodule ApiSampleWeb.HogeView do
# modify here--------^
use ApiSampleWeb, :view
alias ApiSampleWeb.HogeView
# modify here--------^
…
これでOKです
コントローラとビューのモジュール名が不一致していると…
コントローラのモジュール名を基準に、自動的にビューのモジュール名を確定しているようです
終わり
既存APIのURL、コントローラ/ビューのモジュール名をリネームする方法について解説しました
運用中にURLを変更しなくてはならなくなった際や、コントローラ/ビューのモジュール名をスペルミスしてしまった…なんてときには、ご参考ください
次回は、リクエストJSONやレスポンスJSONのキーをリネームする方法について解説する予定です
p.s.「いいね」よろしくお願いします
ページ左上の や
のクリックを、どうぞよろしくお願いします
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください!