URLごとの処理を決める。Railsルーティング入門
今回はRailsのルーティングについて書いていきます。
ルーティングとは何かわからない方のために簡単に説明をすると、ルーティングとは経路のことで、あるurlに対してリクエストを投げた時にどういう処理を行うか振り分ける作業になります。
ここで、URLに対してリクエストを送るという部分にピンとこない方はまずはwebの仕組みを理解してからだとスムーズに進むことができると思います。
ルートの定義の仕方
Railsでのルーティング定義はconfig/route.rbに書いていきます。
他のプログラムと少し違いがあり慣れが必要かと思いますが、少しずつ見ていきながら慣れていきましょう。
railsでのルート定義で1番シンプルな定義の仕方はresourcesを使う方法です。
routes.rbにresourcesを指定するとRestfulに基づいたエンドポイントが良しなに定義されます。
Rails.application.routes.draw do
resources :books
end
またもちろん個別でルーティングを書くことも可能でGETメソッドに割り当てるアクションなら
Rails.application.routes.draw do
get :list
end
postなら
post :create
patchなら
patch :update
というようにhttpメソッドとアクション名を指定してルーティングを定義することも可能です。
ルート定義の確認方法
ルートを定義した後に、ルートが正しく定義されているかどうか確認するためには、コマンドラインもしくは開発用のURLからルーティングの一覧を確認することができます。
コマンドラインから確認をする場合はコンソール画面を開いて
$rake routes
$rake routes
Prefix Verb URI Pattern Controller#Action
books GET /books(.:format) books#index
POST /books(.:format) books#create
new_book GET /books/new(.:format) books#new
edit_book GET /books/:id/edit(.:format) books#edit
book GET /books/:id(.:format) books#show
PATCH /books/:id(.:format) books#update
PUT /books/:id(.:format) books#update
DELETE /books/:id(.:format) books#destroy
で確認することができます。
見方としては、一番左の部分Prefixを指定するとprefixからurlをつくることができます。
link_to '本一覧へのリンク', books_path
でとなりのURI PatternにあるURL(ここでは/books)へのリンクを生成することができます。
/books/:idなどとなっている場合は、
book_path([bookのID])
という形でid付きのpathを生成することができます。
Controller#Actionの列の見方は#より前がController名、#より後がAction名になります。 books#indexと書かれている場合はBooksControllerのindexアクションにバインドされているという ことになります。
また、開発が進んでルートが増えてくると一覧全部表示して確認するのも骨が折れるので、あるワードを元にルート定義を絞り込んで確認したい場合は次のようにします。
$rake/routes.rb | grep hoge
一方既にRailsサーバが立ち上がっている場合は、http://localhost/rails/info/routes
というurlでルーティングを確認することも可能です。(やっぱrails便利)
ルート定義をしていざリクエストを送ってみると404エラーでページが表示されない、期待した動作をしないという時はこれらの方法を使ってルーティングが正しく定義されているか確認しましょう。
ルートのオプション
先に書いたようにresourcesで定義したルーティングは
- new
- index
- show
- edit
- create
- update
- delete
逆に使わないアクションを指定する場合はexceptオプションを使って以下のように書いていきます。
resources :books, except: [:index, :show]
単一のリソースのためのルート定義 resource
resourceは単一のリソースを持つURLのためのメソッドです。
resource :books
resourceメソッドを定義するとデフォルトでnew, show, put, update, edit, delete のアクションが定義されます。
単一のリソースとは、idで指定する必要のないリソース(雑に言うとモデルなど)のこでresourcesではbooks/:idなどのurlは生成されません。
memberメソッド
memberメソッドを使用すると、resourcesなどで指定する以外のアクションを追加することができます。
resources :books do
member do
put :like
end
end
以下のようにすると、デフォルトのindex,showなどの6つのアクションに加えて、likeアクションが追加されます。
urlはidがついた形の/books/:id/likeのようになります。
collectionメソッド
resources :books do
collection do
get :private
end
end
collectionはmemberと同様にアクションを追加することができますが、こちらはurlにidがつかない形のurlを生成することができます。 例のルーティングだとbooks/privateのようになります。ログインユーザーの非公開ブックリストなどのイメージです。
まとめ
以上、こういう形で簡単にではありますがRailsのルーティングについて説明していきました。 最初は慣れない部分もあるかと思いますが、上にも書いたような方法でルートを定義して自分の期待通りのルーテイングに なっているか確認してということを繰り返していけば徐々に慣れていけるかと思います。
Routingについて一記事で全部を説明することはできないですが、必要なところはある程度ここに まとめました。
最初のうちはresourcesでの定義に慣れず、getとかpostとかを直接書いたりしてしまうかもしれないですが、特段理由がなければresourcesを利用してルーティングを定義するくせをつける(適宜only,exceptもつけて)とルーティングがすっきりとかけるようになります。
ここに書いたことはルーティングの基本になるのでおさえておけるようにしましょう!