25
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

検索画面のRESTfulなURL

Posted at

検索機能の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アクション = 機能のトップページ でなくてもよい
  • アクションは目的ごとに分割するのがよい
25
28
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
25
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?