ルーティング設定の基本 (Rails4)
[履歴] [最終更新] (2015/06/04 08:44:49)
最近の投稿
注目の記事

概要

ルーティング設計においては、しばしばRESTfulなインターフェイス設計が推奨されます。ここでいうRESTfulとは「対象となるリソースがURLで一意に定まり、そのリソースに対するCRUD (Create,Read,Update,Delete) をHTTPメソッド (GET,POST,PATCH/PUT,DELETE) で実行する設計」とします。例えばID=2のユーザを削除実行する場合、「/users/2/delete」や「/users/delete/2」とはせずに、「/users/2」にHTTP DELETEするということです。RailsにはこのRESTfulなURL設計を支援する様々な仕組みが用意されています。また、例外的な処理のために、非RESTfulな設定を部分的に行うこともできます。

ルーティング設定ファイル

「config/routes.rb」にルーティング設定を記載します。また、現在のルーティング設定は以下のいずれかの方法で確認できます。

なお、設定項目の優先順位はファイルに記載された順です。そのため、汎用的な設定はファイルの下部に記載する必要があります。

RESTfulな設定

大量にあることが想定されるリソースの場合 (/users/:id/edit等。UsersControllerにマッピング)

resources :users

デザインパターンのSingletonのように、システムに一つしか存在しないことを想定するリソースの場合 (/config/edit等。Config「s」Controllerにマッピング)

resource :config

オプション

マッピングされるコントローラを指定

resources :users, controller: :main  # MainController.rb を指定

URLヘルパーを生成

resources :users, as: :string  # string_url, string_path が使用可能になる

パラメータ制限

モデルでバリデーションするべき項目であるため、冗長といえばそうですが、ルーティングの時点での制限をかけることも可能です。

resources :users, constraints: { id: /[0-9]+/ }

既定のルーティング名称を変更

resources :users, path_names: { new: :mynew }

使用しないルーティングを宣言

resources :users, except: [ :destroy ]

XMLやJSONに対応しないルーティングであることを明示

resources :users, format: false

独自のルーティングを追記

resources :users do
  collection do
    get :deleted  # /users/deleted
  end
  member do
    get :detail  # /users/2/detail
  end
end

リソースの親子関係

すべてを「/users/:user_id/comments」内にネストさせる

resources :users do
  resources :comments
end

コメント「:id」があるものについてはネストさせない (ネストによりURLが長くなることを防止)

resources :users do
  resources :comments, shallow: true
end

非RESTfulな設定

どのようなリクエストにも対応できてしまう設定。脆弱性あり

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

viaで指定するHTTPメソッドが一つの場合の記法

get ':controller(/:action(/:id))'
post ':controller(/:action(/:id))'
patch ':controller(/:action(/:id))'

ルートURL ('/') へのアクセス時に使用するルーティング設定

root 'main#index', as: :top  #URLヘルパーを生成 (top_url, top_path)

オプション

以上の設定のシンボル部分「:controller」「:action」はいずれもワイルドカードです。コントローラやアクションを固定して指定するためには以下のようにします。

get 'string/:abc' => 'controllername#actionname'
get 'string/:abc' => 'controllername#actionname', constraints: { abc: /[0-9]+/ }
get 'string/(:abc)' => 'controllername#actionname', defaults: { abc: '123' }
get 'string/:abc' => redirect('/string2/%{abc}')
get 'string' => 'main#index', as: :top  #URLヘルパーを生成 (top_url, top_path)

Rails で定期処理を実行 (関連情報)

Whenever 等の定期実行用 Gem を利用するのもよいのですが、Web フレームワーク特有の手続きを習得する必要があります。それを避けたい場合は HTTP の API を作成し、それを localhost の cron などで curl を実行して叩けばよいです。

関連ページ