読者です 読者をやめる 読者になる 読者になる

なんちゃってウェブ系エンジニアの備忘録

某IT企業で働くなんちゃってウェブ系エンジニアが技術やデザインなど役に立ちそうなものなどを備忘録として載せていきます

ルーティングを理解してみる

Railsでは、URL(パラメーターを含む)をもとにコントローラ/アクションを決定するというルーティングがあり、これらは「アプリ名/config/routes.rb」という設定ファイルに定義します。

その設定ファイルの中身を確認するといろんなサンプルが記述されていますが、
利用頻度が高そうなものをまとめておきたいと思います。

ちなみに著者はRails 4.1.4、ruby 2.0.0を動作させた環境を前提として進めていきます。
最近勉強したばかりですので、間違っている等などがあればご指摘していただければと思います。

HTTPメソッドを利用したシンプルな例

get 'URL', to: 'コントローラー#アクション'

get 'yokohama', to: 'user#kanagawa'

http://XXXXXX/yokohamaへアクセスした場合、userコントローラーのkanagawaアクションから呼び出せるようになります。

matchメソッド

match ':controller(/:action(/:id))', via: [ :get, :post, :patch ]

すべてのアクションメソッドが/controller/actionの形式で呼び出せるようになります。
しかし、全てのアクションがGETで実行されてしまうという懸念があり、Railsが理想とすRESTful設計に準拠すべきであるということでRails4から非推奨となったそうです。
そこまで深く掘り下げずとにかくRaisを触りたい、学習したい場合は上記のように設定しても問題ないかと思います。

RESTfulとは

REST(Representational State Transfer)の略語。Webアプリケーションなどにおける設計概念の一つで簡単にいうと、操作の対象となるリソースをURLを使って表し、HTTPメソッドの「GET」「POST」「DELETE」「PATCH(Rails3まではPUT)」を使って操作を行なうというものです。
現状のブラウザではPATCH(PUT)、DELETEのHTTPメソッドがサポートされていない(将来実装するかも?)ですが、Railsではライブラリという力?を借りてRESTful設計に基づいたインタフェースを作ることができます。

resourcesメソッド

resources :リソース名 [オプション]

RESTful設計思想に則ったURLを自動生成することができます。

モデルによって作成されたnewsの場合

resources :news
news_index GET    /news(.:format)          news#index
           POST   /news(.:format)          news#create
  new_news GET    /news/new(.:format)      news#new
 edit_news GET    /news/:id/edit(.:format) news#edit
      news GET    /news/:id(.:format)      news#show
           PATCH  /news/:id(.:format)      news#update
           PUT    /news/:id(.:format)      news#update
           DELETE /news/:id(.:format)      news#destroy

http://XXXXXX//rails/info/routes
もしくは
rake routesコマンドで確認すると上記のようなURLが自動生成されます。
resourcesメソッドはビューヘルパーlink_toで使えるので大変便利です。

<%= link_to '一覧画面', news_index_path %>
<!-- 出力結果 <a href="/news">一覧画面</a> -->
<%= link_to '登録画面', new_news_path %>
<!-- 出力結果 <a href="/news/new">登録画面</a> -->
<%= link_to '編集画面', edit_news_path(1) %>
<!-- 出力結果 <a href="/news/1/edit">編集画面</a> -->

resourcesはいろんなオプションがあって、カスタマイズが可能ですので詳しいことは以下のサイトにてご確認ください。
resources - リファレンス - Railsドキュメント

resourceメソッド

resource :リソース名 [オプション]

resourcesメソッドと似てますが、アプリケーションの中で1つしかない情報、単体リソースとして扱いたい場合はresourceメソッドを利用します。

     news POST   /news(.:format)      news#create
 new_news GET    /news/new(.:format)  news#new
edit_news GET    /news/edit(.:format) news#edit
          GET    /news(.:format)      news#show
          PATCH  /news(.:format)      news#update
          PUT    /news(.:format)      news#update
          DELETE /news(.:format)      news#destroy

resourcesメソッドと比べるとPathにid:が含まれなくなりindexアクションがなくなっていることが分かります。

rootメソッド

例えば、「http://XXXXXX.co.jp/」に対し、トップページを指定したい場合は、rootメソッドを利用します。

root 'user#index'

http://XXXXXX.co.jp/」へアクセスしたら、userコントローラーのindexアクションから呼び出すことができます。

namespaceブロック

/アプリ名/app/controllers

コントローラークラスが格納されているディレクトリに多くのファイルがあると保守しづらい点があるかと思います。
その場合はサブフォルダを作成するなり保守性を上げたい場合、このような構成に対しnamespaceブロックを利用します。

namespace :admin do
  resources :blog
end
/admin/blog(.:format)	        admin/blog#index
/admin/blog(.:format)	        admin/blog#create
/admin/blog/new(.:format)	admin/blog#new
/admin/blog/:id/edit(.:format)	admin/blog#edit
/admin/blog/:id(.:format)	admin/blog#show
/admin/blog/:id(.:format)	admin/blog#update
/admin/blog/:id(.:format)	admin/blog#update
/admin/blog/:id(.:format)	admin/blog#destroy

管理者用サイトとユーザーサイトに分けたい場合などそういった用途に使えそうなと思います。