Last-modified: 2010-09-24 (金) 21:50:19 (10h)
Rails Routing from the Outside In †
原文 †http://guides.rubyonrails.org/routing.html 裏の裏までルーティング(Rails Routing from the Outside In) †このガイドではユーザー向けのRails のルーティング機能を学ぶことができます。
1 ルーターの目的(The Purpose of the Rails Router) †ルーターは URL を認識し、コントローラーのアクションにディスパッチ(送出)します。 1.1 コードに URL を繋ぐ(Connecting URLs to Code) †Rails アプリケーションが、入ってくるリクエストを受け取った時、 GET /patients/17 それがコントローラーのアクションにマッチするか、ルーターに問い合わせます。 match "/patients/:id" => "patients#show" なら、リクエストは、 patients コントローラーの show アクションに、 params 内の { :id => "17" } とともにディスパッチされます。 1.2 コードからパスと URL の生成(Generating Paths and URLs from Code) †パスと URL の生成も出来ます。 @patient = Patient.find(17) <%= link_to "Patient Record", patients_path(@patient.id) %> ルーターは、 /patients/17 を生成するでしょう。 2 リソースルーティング: Rails のデフォルト(Resource Routing: the Rails Default) †リソースルーティングは、与えられたリソースフルなコントローラーのための共通ルーティングの全ての宣言を迅速に、出来るようにします。 2.1 ウェブ上のリソース(Resources on the Web) †ブラウザは、GET 、 POST 、 PUT 、 DELETE のような特定のHTTP メソッドを使って URL からリクエストを作ることにより、 Rails からページをリクエストします。 Rails アプリケーションが、入ってくるリクエストを受け取った時、 DELETE /photos/17 それがコントローラーのアクションにマッチするか、ルーターに問い合わせます。 resources :photos
なら、 Rails は、リクエストを、 photos コントローラーの destroy メソッドに、 params 内の { :id => "17" } とともにディスパッチするでしょう。 2.2 CRUD 、Verbs 、 Actions (CRUD, Verbs, and Actions) †Rails では、リソースフルルーティングは HTTP verbs と URL と コントローラーアクションの間のマッピングを提供します。 resources :photos
アプリケーション内に7つの異なったルーティングを作成します、 Photos コントローラーの全てのマッピングは:
2.3 パスと URL (Paths and URLs) †リソースフルルーティングの作成は、またアプリケーション内のコントローラーで、いくつかのヘルパを使えるようにするでしょう。
これらのヘルパ全ては、 対応する _url ヘルパ( photos_url のような)を持っていて、 ルーターは、内向きのリクエストにマッチするために HTTP verb や URL を使うので、4つの URL は7つの異なるアクションにマッピングします。 2.4 同時に複数のリソースの定義(Defining Multiple Resources at the Same Time) †一つ以上のリソースのためのルーティングを作成する必要があるなら、単一の resources 呼び出しで全てを定義することによって、タイピングを少し減らすことが出来ます: resources :photos, :books, :videos これは、以下と全く同じように動きます。 resources :photos resources :books resources :videos 2.5 単一のリソース(Singular Resources) †時々、クライアントがいつも ID を参照すること無しに訪ねるリソースがあります。 match "profile" => "users#show" このリソースルーティングは resource :geocoder
6つの異なるルーティングをアプリケーション内に作成します、全て Geocoders コントローラーへのマッピングです:
単一のルーティング( /account )と複数系のルーティング( /accounts/45 )のために、同じコントローラーを使いたいかもしれないので、単一のリソースは複数のコントローラーにマッピングします。 単一のリソースフルルーティングは、これらのヘルパを生成します:
複数形のリソースと同様に、 _url で終わる同じヘルパはまたホスト、ポート、パスの接頭辞を含むでしょう。 2.6 コントローラーのネームスペースとルーティング(Controller Namespaces and Routing) †ネームスペース下で、コントローラのグループを整理したいかもしれません。 namespace "admin" do resources :posts, :comments end これは posts コントローラーと、 comments コントローラーの全てに対するいくつかのルーティングを作るでしょう。
/photos (頭に /admin 無し)を Admin::PostsController にルーティングしたい場合、以下を使えます。 scope :module => "admin" do resources :posts, :comments end もしくは、単一の場合は、 resources :posts, :module => "admin" /admin/photos を PostsController (頭に Admin:: module 無し)にルーティングしたい場合、以下を使えます。 scope "/admin" do resources :posts, :comments end もしくは、単一の場合は、 resources :posts, :path => "/admin" これらのケース全てで、名前付きルーティングは scope を使用していない場合と同じく残っています。
2.7 ネストしたリソース(Nested Resources) †他のリソースの論理的な子は、リソースを持っているのが一般的です。 class Magazine < ActiveRecord::Base has_many :ads end class Ad < ActiveRecord::Base belongs_to :magazine end ネストしたルーティングは、ルーティング内のこの関連を捉えられます。 resources :magazines do resources :ads end magazines のためのルーティングに加えて、この宣言は AdsController に ads をルーティングするでしょう。
これは magazine_ads_url や edit_magazine_ad_path のようなルーティングヘルパも作成します。 2.7.1 ネストの制限 お望みなら、他のネストしたリソースの中に、リソースをネストできます。 resources :publishers do resources :magazines do resources :photos end end 深くネストされたリソースは、すぐに面倒になります。 /publishers/1/magazines/2/photos/3 これに対応するルーティングヘルパは、 publisher_magazine_photo_url でしょう、それは、3階層にあるオブジェクトの指定を要求します。 リソースは、決して1階層以上ネストしないべきでしょう。 2.8 オブジェクトからのパスと URL の作成(Creating Paths and URLs From Objects) †ルーティングヘルパの使用に加えて、 Rails はまたパラメーターの配列から、パスと URL を作成できます。 resources :magazines do resources :ads end magazine_ad_path を使う時、数値の ID の代わりに、 Magazine と Ad のインスタンスを渡せます。 <%= link_to "Ad details", magazine_ad_path(@magazine, @ad) %> また、オブジェクトのセットと url_for を使え、 Rails は自動的にあなたが必要なルーティングを決定するでしょう: <%= link_to "Ad details", url_for(@magazine, @ad) %> この場合では、 Rails は @magazine は Magazine で、 @ad は Ad だと思い、従って、 magazine_ad_path helper を使うでしょう。 <%= link_to "Ad details", [@magazine, @ad] %> ただ magazine へだけリンクしたい場合、 Array も省くことが出来ます: <%= link_to "Magazine details", @magazine %> これは、 URL としてモデルのインスタンスを扱うことが出来、リソースフルなスタイルを使う主な利点です。 2.9 もっと RESTful なアクションの追加(Adding More RESTful Actions) †デフォルトで作られる RESTful なルーティング7つに制限されません。 2.9.1 メンバルーティングの追加 メンバルーティングを追加するために、リソースブロック内にメンバーブロックを追加してください: resources :photos do member do get 'preview' end end これは /photos/1/preview と GET だと認識し、 PhotosController の preview アクションにルーティングするでしょう。 メンバルーティングのブロック内で、全てのルーティング名は HTTP verb を指定すると、認識するでしょう。 resources :photos do get 'preview', :on => :member end 2.9.2 コレクションルーティングの追加 コレクションにルーティングを追加するために: resources :photos do collection do get 'search' end end これは Rails が、 /photos/search と GET のようなパスを理解出来るようにし、 PhotosController の search アクションにルーティングします。 メンバルーティングと同様に、 :on をルーティングに渡せます: resources :photos do get 'search', :on => :collection end 2.9.3 注意書き もしリソースフルルーティングに多くの余分なアクションを追加していると気づいたなら、 3 リソースフルでないルーティング(Non-Resourceful Routes) †リソースルーティングに加えて、 Rails は、任意の URL をアクションにルーティングするのための強力なサポートを持っています。 通常、リソースフルなルーティングを使うべきですが、シンプルなルーティングがより適切な多くの場合があります。 特に、シンプルなルーティングは、古い URL を新しい Rails のアクションにマッピングするのを簡単にします。 3.1 バインドされたパラメーター(Bound Parameters) †いつものルーティングを設定する場合、 Rails が内向きの HTTP リクエストの一部にマッピングする一連のシンボルを指定します。 match ':controller(/:action(/:id))'
/photos/show/1 の内向きのリクエストが、このルーティングによって処理されたら、(ファイル内のそれ以前のルーティングにマッチしなかったことにより) 3.2 動的セグメント(Dynamic Segments) †いつものルーティング内に、お望みの数だけ動的セグメントを設定できます。 match ':controller/:action/:id/:user_id'
/photos/show/1/2 の内向きのパスは、 PhotosController の show アクションにディスパッチされるでしょう。 namespace や :module と、 :controller パスセグメントを使えません。~ match ':controller(/:action(/:id))', :controller => /admin\/[^\/]+/ 3.3 静的セグメント(Static Segments) †3.4 (The Query String) †3.5 (Defining Defaults) †3.6 (Naming Routes) †3.7 (Segment Constraints) †3.8 (Request-Based Constraints) †3.9 (Advanced Constraints) †3.10 (Route Globbing) †3.11 (Redirection) †3.12 (Routing to Rack Applications) †3.13 (Using root) †4 (Customizing Resourceful Routes) †4.1 (Specifying a Controller to Use) †4.2 (Specifying Constraints) †4.3 (Overriding the Named Helpers) †4.4 (Overriding the new and edit Segments) †4.5 (Prefixing the Named Route Helpers) †4.6 (Restricting the Routes Created) †4.7 (Translated Paths) †4.8 (Overriding the Singular Form) †4.9 (Using :as in Nested Resources) †5 (Inspecting and Testing Routes) †5.1 (Seeing Existing Routes with rake) †5.2 (Testing Routes) †6 (Changelog) †コメント欄(誤訳・誤字があれば教えて頂ければ幸いです。) † |