LoginSignup
7
4

More than 3 years have passed since last update.

既存APIのリネーム①:URL、コントローラおよびビューのモジュール名

Last updated at Posted at 2019-03-19

fukuoka.ex代表のpiacereです
ご覧いただいて、ありがとうございます :bow:

mix phx.gen.jsonで自動生成したAPIのリネームをしたいとき、どこを直す必要があり、直さなくて良いところがどこか、イマイチ分かりにくいので、まとめてみました

前半は、「URL」と「コントローラおよびビューのモジュール名」のリネームです(「API」と前置きしていますが、自動生成したHTMLも、ほぼ同様です)

なお、「Phoenix」は、ElixirのWebフレームワークです

内容が、面白かったり、役に立ったら、「いいね」よろしくお願いします :wink:

本コラムの検証環境、事前構築のコマンド

本コラムは、以下環境で検証しています(Windowsで実施していますが、Linuxやmacでも動作する想定です)

また、以下コマンドで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()をリネームする必要があります

lib/api_sample_web/router.ex
defmodule ApiSampleWeb.Router do

  scope "/", ApiSampleWeb do
    
    resources "/hoge", PostController, except: [:new, :edit]
    # modify here-^
    
lib/api_sample_web/controllers/post_controller.ex
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の呼び出しているコントローラ名です

lib/api_sample_web/router.ex
defmodule ApiSampleWeb.Router do

  scope "/", ApiSampleWeb do
    
    resources "/post", HogeController, except: [:new, :edit]
    # modify here--------^
    

次に、コントローラのモジュール名です

なお、ここではファイル名も変更していますが、必須ではありません(が、変えておいた方が無難です)

lib/api_sample_web/controllers/post_controller.ex ※変更前
defmodule ApiSampleWeb.PostController do

lib/api_sample_web/controllers/hoge_controller.ex ※変更後
defmodule ApiSampleWeb.HogeController do
  # modify here---------^

それから、ビューのリネームも必要です(こちらも、ファイル名の変更は必須ではありません)

lib/api_sample_web/views/post_view.ex ※変更前
defmodule ApiSampleWeb.PostView do
  use ApiSampleWeb, :view
  alias ApiSampleWeb.PostView
   
lib/api_sample_web/views/hoge_view.ex ※変更後
defmodule ApiSampleWeb.HogeView do
# modify here--------^
  use ApiSampleWeb, :view
  alias ApiSampleWeb.HogeView
  # modify here--------^
   

これでOKです

コントローラとビューのモジュール名が不一致していると…

こんなエラー画面が出ます
image.png

コントローラのモジュール名を基準に、自動的にビューのモジュール名を確定しているようです

終わり

既存APIのURL、コントローラ/ビューのモジュール名をリネームする方法について解説しました

運用中にURLを変更しなくてはならなくなった際や、コントローラ/ビューのモジュール名をスペルミスしてしまった…なんてときには、ご参考ください

次回は、リクエストJSONやレスポンスJSONのキーをリネームする方法について解説する予定です

p.s.「いいね」よろしくお願いします

ページ左上の image.pngimage.png のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください!:tada:

7
4
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
7
4