検索機能のURLとかアクション名をどうしようか考えて迷子になったので、色々と考えたことを残しておきます。
非RESTfulなURL
最初は、/employees
というURLで検索フォームを表示し、/employees/find
をPOSTメソッドで呼んだら検索結果を表示する。ビューは共通で使うようにして、検索結果が空じゃなかったら一覧表示する。というのを考えていました。
URL | メソッド | アクション | ビュー | 備考 |
---|---|---|---|---|
/employees | GET | index | index.html.erb | 検索フォームを表示する |
/employees/find | POST | find | index.html.erb | 検索結果を一覧表示する |
しかし、色々と調べていたら、この設計はRESTfulじゃないということがわかってきました。
まず、POSTメソッドはリソースを新しく登録する時に使われるべきで、リソースについての情報を表示するのはGETメソッドでおこなうというのがRESTの考え方です。
この考えに従うと、/employees
というリソース名だけのURLをGETメソッドで呼んだら、従業員の一覧を返すのが良いみたいです。
しかし、このURLは従業員情報を管理する機能のトップページにしたいので、検索フォームを表示するだけにしたいです。ここにこだわってしまったせいでずいぶん時間を無駄にしました。
indexがトップページである必要はない
indexアクションに対応する/employees
をGETしたときはリソースの一覧を返すべきですが、別にそれがトップページである必要はありません。indexという単語に囚われて、トップページでなければならないと思い込んでいました。
機能のトップページは検索フォームを表示するだけというのは変わりませんが、このURLを/employees/find
としました。ビューも別々にして「従業員情報検索」と「従業員情報一覧」としました。これで頭の中がずいぶんとスッキリしました。
URL | メソッド | アクション | ビュー | 備考 |
---|---|---|---|---|
/employees/find | GET | find | find.html.erb | 検索フォームを表示する |
/employees | GET | index | index.html.erb | 検索結果を一覧表示する |
検索パラメータが空だったら検索を行わない。という方法も考えたのですが、ひとつのアクションの中でやることを分岐させるよりも、機能の目的ごとにアクションを作った方が、シンプルさを維持できるのでよかったと思います。
一覧画面にも検索フォームを表示する必要はあるのですが、部分テンプレートを使えば重複せずに実装できました。
まとめ
- 情報を表示するリクエストはGETメソッドにする
- リソースの状態を変更しないリクエストをPOSTにしない
- indexアクション = 機能のトップページ でなくてもよい
- アクションは目的ごとに分割するのがよい