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

[fukuoka.ex](https://fukuokaex.connpass.com/)代表のpiacereです
ご覧いただいて、ありがとうございます :bow:

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

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

なお、[「Phoenix」](https://qiita.com/piacerex/items/b7787580fce5f148242f#phoenix%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)は、ElixirのWebフレームワークです

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

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

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

- Windows 10
- Elixir 1.8.1　　　　※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99elixir%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)</b>
- Phoenix 1.4.0 　　 ※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacere_ex/items/b7787580fce5f148242f#phoenix%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)</b>
- PostgreSQL 10.1 　※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacere_ex/items/a7558adc6856e3577dc6#postgresql%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)</b>

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

```elixir:lib/api_sample_web/router.ex
defmodule ApiSampleWeb.Router do
…
  scope "/", ApiSampleWeb do
    …
    resources "/hoge", PostController, except: [:new, :edit]
    # modify here-^
    …
```

```elixir: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の呼び出しているコントローラ名です

```elixir:lib/api_sample_web/router.ex
defmodule ApiSampleWeb.Router do
…
  scope "/", ApiSampleWeb do
    …
    resources "/post", HogeController, except: [:new, :edit]
    # modify here--------^
    …
```

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

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

```elixir:lib/api_sample_web/controllers/post_controller.ex　※変更前
defmodule ApiSampleWeb.PostController do
…
```

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

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

```elixir:lib/api_sample_web/views/post_view.ex　※変更前
defmodule ApiSampleWeb.PostView do
  use ApiSampleWeb, :view
  alias ApiSampleWeb.PostView
   …
```

```elixir: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](https://qiita-image-store.s3.amazonaws.com/0/155423/2d475009-3dbe-0b12-f8a6-5984c7e2901c.png)

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

# 終わり

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

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

[次回は、リクエストJSONやレスポンスJSONのキーをリネームする方法について解説](https://qiita.com/piacere_ex/items/ff3c95b5600dfc20ca58)する予定です

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

ページ左上の ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください！:tada: