URLごとの処理を決める。Railsルーティング入門

今回はRailsのルーティングについて書いていきます。

ルーティングとは何かわからない方のために簡単に説明をすると、ルーティングとは経路のことで、あるurlに対してリクエストを投げた時にどういう処理を行うか振り分ける作業になります。

ここで、URLに対してリクエストを送るという部分にピンとこない方はまずはwebの仕組みを理解してからだとスムーズに進むことができると思います。

Webエンジニアなら知っておきたい – 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
という6つのアクションが自動で設定されます。 ただコントローラでこれら全部のアクションを使う訳ではないのでので必要なアクションだけを定義する場合は ```ruby resources :books, only: [:index, :show] ``` などとします。これでindex,showアクションだけルートに定義されます。

逆に使わないアクションを指定する場合は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もつけて)とルーティングがすっきりとかけるようになります。

ここに書いたことはルーティングの基本になるのでおさえておけるようにしましょう!