Qiita Jobsで転職すると、お祝い金30万円がもらえるキャンペーンを実施中!, https://triple-underscore.github.io/RFC7231-ja.html#section-5.5.2, you can read useful information later efficiently. 例2では/about/hoge/fugaや/about/Fizz/Buzz/FizzBuzzなどにマッチします。params[:segment]はhoge/fugaやFizz/Buzz/FizzBuzzになります。 you can read useful information later efficiently. 遷移前のページのURLによってページに表示するリンク先を分岐させる処理がしたかった。 わかったことだけなので網羅はしてないです。間違いもあるかもしれないので、あったら指摘してもらえるとうれしいです。, Ruby on Rails チュートリアル 目的. 遷移前のページのURLによってページに表示するリンク先を分岐させる処理がした … :asオプションを使うことで、Railsがルーティングに対して生成する名前付きルーティングヘルパー名の冒頭に文字を追加できます (プレフィックス)。パススコープを使うルーティング同士での名前の衝突を避けたい場合に使ってください。例: 上のルーティングでは、admin_photos_pathやnew_admin_photo_pathなどのルーティングヘルパーが生成されます。, ルーティングヘルパーのグループにプレフィックスを追加するには、以下のようにscopeメソッドで:asオプションを使います。, 上によって、admin_photos_pathとadmin_accounts_pathなどのルーティングが生成されます。これらは/admin/photosと/admin/accountsにそれぞれ割り当てられます。, namespaceスコープを使うと、:moduleや:pathプレフィックスに加えて:asも自動的に追加されます。, 上のルーティングにより、/bob/articles/1のような形式のURLを使えるようになります。さらに、コントローラ、ヘルパー、ビューのいずれにおいても、このパスのusernameの部分に相当する文字列 (この場合であればbob) をparams[:username]で参照できます。, Railsは、アプリケーション内のすべてのRESTfulルーティングに対してデフォルトで7つのアクション (index、show、new、create、edit、update、destroy) へのルーティングを作成します。:onlyオプションや:exceptオプションを使うことで、これらのルーティングを微調整できます。:onlyオプションは、指定されたルーティングだけを生成するよう指示します。, これで、/photosへのGETリクエストは成功し、/photos へのPOSTリクエスト (通常であればcreateアクションにルーティングされます) は失敗します。, :exceptオプションは逆に、指定したルーティングのみを生成 しない よう指示します。, この場合、destroy (/photos/:idへのDELETEリクエスト) を除いて通常のルーティングが生成されます。, アプリケーションでRESTfulルーティングが多数使用されているのであれば、それらに適宜:onlyや:exceptを使って、本当に必要なルーティングのみを生成することで、メモリ使用量の節約とルーティングプロセスの速度向上が見込めます。, scopeメソッドを使うことで、resourcesによって生成されるデフォルトのパス名を変更できます。, 上のようにすることで、以下のようなCategoriesコントローラへのルーティングが作成されます。, あるリソースの「単数形のフォーム」を定義したい場合、Inflectorに活用形ルールを追加します。. draw do get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy'.. end ログインページを作成 セッションにはSessionモデルというものがなく、 @task のようなインスタンス変数に相当するものもありません。 More than 1 year has passed since last update. 名前付きルートはControllerとViewで利用できる ※「match」を「get」にしても同じ名前付きルートになるが、 matchを利用する方がより「Railsっぽい」。 定義される名前付きルートの中身 どうも不思議な魔法で動いているみたいで、コードを読んでもさっぱりわかりません。というか読むコードがありません。 application. :format), 使用されているHTTP動詞 (そのルーティングがすべてのHTTP動詞に応答するのでない場合). Railsのルーティング記法の基本は、resourcesとresourceです。また、Railsのルーティングにはネストを含む多くのオプションがあり、自由度が飛躍的に高まっています。 以下の2つのルーティングは、ネストしていない単純なresourcesルーティングです。prefectures、articlesいずれも、コントローラに合わせて複数形で書く点にご注意ください。 rake routesしてみると、prefecturesとarticlesそれぞれについてRESTfulかつ標準的なアクション(index/create/new/edit/show/update/destroy)を網羅したなルーティン … Railsの経験はなかったのですが、まあコード読めばわかるだろう、と思っていたら大間違い。 テストのことはもちろん、GitとかBootstrapなどRails以外の周辺知識にも触れています。 RailsでWebアプリを開発していると、ユーザーが入力するフォームを作ることが多くなります。フォームを作る際に、最も使用するメソッドがform_forです。でもいざ使うとなると、 form_forの使い方がわからない! form_forにclassをつけたいけど、どうやるんだっけ? Railsのリソースフルルーティングでは、(GET、PUTなどの) 各種HTTP動詞 (verb) と、コントローラ内アクションを指すURLが対応付けられます。 その際に遷移前のページのURL取得方法を調べたのでメモ。, http://railsdoc.com/references/request assert_generatesは、特定のオプションの組み合わせを使った場合に特定のパスが生成されること、そしてそれらがデフォルトのルーティングでもカスタムルーティングでも使えることをテストするアサーション (assert, assertion: 主張・検証とも) です。例: assert_recognizesはassert_generatesと逆方向のテスティングを行います。与えられたパスが認識可能であること、アプリケーションの特定の場所にルーティングされることをテストするアサーションです。例: assert_routingアサーションは、ルーティングを2つの観点 (与えられたパスによってオプションが生成されること、そのオプションによって元のパスが生成されること) からチェックします。つまり、assert_generatesとassert_recognizesの機能を組み合わせたものになります。, Railsガイドをもっと便利に使えるサービスをリリースしました! 技術上は、1つのルーティングに2つ以上のワイルドカードセグメントを含めることは可能です。マッチャがセグメントをパラメータに割り当てる方法は直感的です。例: 上のルーティングはzoo/woo/foo/bar/bazにマッチし、params[:a]には'zoo/woo'が保存され、params[:b]には'bar/baz'が保存されます。, '/foo/bar.json'をリクエストするとparams[:pages]には'foo/bar'がJSONリクエストフォーマットで保存されます。Rails 3.0.xの動作に戻したい場合は、以下のようにformat: falseを指定することができます。, このセグメントフォーマットを必須にしたい場合は、以下のようにformat: trueを指定します。, ルーティングでredirectを使うと、あるパスを他のあらゆるパスにリダイレクトできます。, リダイレクトにブロックを渡すこともできます。このリダイレクトは、シンボル化されたパスパラメータとrequestオブジェクトを受け取ります。, デフォルトのリダイレクトは、HTTPステータスで言う「301 "Moved Permanently"」であることにご注意ください。一部のWebブラウザやプロキシサーバーはこの種のリダイレクトをキャッシュすることがあり、その場合リダイレクト前の古いページにはアクセスできなくなります。次のように:statusオプションを使うことでレスポンスのステータスを変更できます。, どの場合であっても、ホスト (http://www.example.comなど) がURLの冒頭で指定されていない場合は、Railsは (以前のリクエストではなく) 現在のリクエストから詳細を取得します。, Postコントローラのindexアクションに対応する'articles#index'のような文字列の代りに、任意のRackアプリケーションをマッチャーのエンドポイントとして指定することができます。, Railsルーターから見れば、MyRackAppがcallに応答して[status, headers, body]を返す限り、ルーティング先がRackアプリケーションであるかアクションであるかは区別できません。これはvia: :allの適切な利用法です。というのは、適切と考えられるすべてのHTTP動詞をRackアプリケーションで扱えるようにできるからです。, 参考までに、'articles#index'は実際にはArticlesController.action(:index)という形に展開されます。これは正しいRackアプリケーションを返します。, マッチャーのエンドポイントとしてRackアプリケーションを指定する場合、受け取るアプリケーションのルーティングは変更されない点にご留意ください。以下のルーティングでは、Rackアプリケーションは/adminへのルーティングを期待するべきです。, Rackアプリケーションがルートパスでリクエストを受け取れるようにしたい場合は、mountを使います。, rootメソッドを使うことで、Railsがルート'/'とすべき場所を指定できます。, rootルーティングは、ルーティングファイルの先頭に記述してください。rootは最もよく使用されるルーティングであり、最初にマッチする必要があるからです。, このブロックの戻り値は、必ずurl_forメソッドで有効な1個の引数にならなければなりません。これによって、有効な文字列URL/ハッシュ/配列/Active Modelインスタンス/Active Modelクラスのいずれかを1つ渡せるようになります。, resolveメソッドを使うと、モデルのポリモーフィックなマッピングを次のようにカスタマイズできます。, 上のコードは、通常の/baskets/:idではなく、単数形の/basketというURLを生成します。, ほとんどの場合、resources :articlesのような指定を行ってデフォルトのルーティングやヘルパーを生成することで用は足りますが、もう少しルーティングをカスタマイズしたくなることもあります。Railsでは、リソースフルなヘルパーの一般的などの部分であっても事実上自由にカスタマイズ可能です。. 早く慣れてサクサク開発ができるようになりたいです。, 主にiOSエンジニアとしてSwiftを書いています。 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. URLをどのコントローラのどのアクションで処理するかを記述します。, 上記の例は、/aboutというURLへのアクセスをStaticPages(コントローラ)のabout(アクション)で処理する、という意味になります。 routes. 例3のように、matchを使うと複数のメソッドを同じアクションに紐付けることができます。全てのメソッドを紐付けるには、例4のように:allが使えます。あまり使う機会はなさそうですが。 本サービスで得られた売上はRailsガイドを継続的に更新・運営するために活用させていただきます。よければぜひご検討ください ;), Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、上記リポジトリにてお気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。, 原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください ✨, 本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。よろしくお願いします。, Railsガイドは下記のサポーターから継続的な支援を受けています。Railsガイドへの支援・協賛にご興味あれば info@yasslab.jp までお問い合わせください。, /articles/:article_id/comments/new(. 例1はコントローラとアクションをまとめて書く方法で、to:のあとに'コントローラ名#アクション'と書きます。コントローラの名前の謎についてはこちらをどうぞ。 Ruby Rails. Why not register and get more from Qiita? このチュートリアルとても良くできています。 What is going on with this article? Railsはこのリクエストをphotosコントローラ内のdestroyアクションに割り当て、paramsハッシュに{ id: '17' }を含めます。. Rails. https://triple-underscore.github.io/RFC7231-ja.html#section-5.5.2. というものがあります。 このガイドでは、開発者に向けてRailsのルーティング機能を解説します (訳注: routeとrootを区別するため、訳文ではrouteを基本的に「ルーティング」と訳します)。, お知らせ: Railsガイドが Carbon Ads for Open Source の対象になりました, Railsのルーターは受け取ったURLを認識し、適切なコントローラ内アクションやRackアプリケーションに割り当てます。ルーターは、ビューでこれらのパスやURLを直接ハードコードすることを避けるためにパスやURLを生成することもできます。, このリクエストは、特定のコントローラ内アクションにマッチさせるようルーターに要求しています。最初にマッチしたのが以下のルーティングだとします。, このリクエストはpatientsコントローラのshowアクションに割り当てられ、paramsには{ id: '17' }ハッシュが含まれています。, Railsではコントローラ名にスネークケースを使います。たとえばMonsterTrucksControllerのような複合語のコントローラを使う場合は、monster_trucks#showのように指定します。, パスやURLを生成することもできます。たとえば、上のルーティングが以下のように変更されたとします。, これで、ルーターによって/patients/17というパスが生成されます。これを利用することでビューが改修しやすくなり、コードも読みやすくなります。このルーティングヘルパーではidを指定する必要がない点にご注目ください。, アプリケーションやエンジンのルーティングはconfig/routes.rbファイルの中に存在し、通常以下のような感じになっています。, これは通常のRubyソースファイルなので、Rubyのあらゆる機能を用いてルーティングを定義できます。ただし変数名には注意が必要です。ルーターのDSLメソッド名と変数名と衝突する可能性があります。, ルーティング定義をラップするRails.application.routes.draw do ... endブロックは、ルーターDSLのスコープを確定するのに不可欠なので、削除してはいけません。, リソースベースのルーティング (以下リソースルーティング) を使うことで、リソースベースで構成されたコントローラに対応する共通のルーティングを手軽に宣言できます。リソースフルなルーティングを宣言することで、コントローラのindex、show、new、edit、create、update、destroyアクションを個別に宣言しなくても1行で宣言が完了します。, ブラウザはRailsに対してリクエストを送信する際に、特定のHTTPメソッド (GET、POST、PATCH、PUT、DELETEなど) を使って、URLに対するリクエストを作成します。上に述べたHTTPメソッドは、いずれもリソースに対して特定の操作の実行を指示するリクエストです。リソースルーティングでは、関連するさまざまなリクエストを1つのコントローラ内のアクションに割り当てます。, このリクエストは、特定のコントローラ内アクションにマッピングさせるようルーターに要求しています。最初にマッチしたのが以下のルーティングだとします。, Railsはこのリクエストをphotosコントローラ内のdestroyアクションに割り当て、paramsハッシュに{ id: '17' }を含めます。, Railsのリソースフルルーティングでは、(GET、PUTなどの) 各種HTTP動詞 (verb) と、コントローラ内アクションを指すURLが対応付けられます。1つのアクションは、データベース上での特定のCRUD (Create/Read/Update/Delete) 操作に対応付けられるルールになっています。たとえば、以下のようなルーティングが1つあるとします。, 上の記述により、アプリケーション内に以下の7つのルーティングが作成され、いずれもPhotosコントローラに対応付けられます。, Railsのルーターでは、サーバーへのリクエストをマッチさせる際にHTTP動詞とURLを使っているため、4種類のURL (/photos,/photos/new,/photos/:id,/photos/:id/edit) が7種類の異なるアクション (index/new/create/show/edit/update/destroy) に割り当てられています。, Railsのルーティングは、ルーティングファイルの「上からの記載順に」マッチします。このため、たとえばresources :photosというルーティングがget 'photos/poll'よりも前の行にあれば、resources行のshowアクションがget行の記述よりも優先されますので、get行のルーティングは有効になりません。これを修正するには、get行をresources行 よりも上 の行に移動してください。これにより、get行がマッチするようになります。, リソースフルなルーティングを作成すると、アプリケーションのコントローラで多くのヘルパーが利用できるようになります。resources :photosというルーティングを例に取ってみましょう。, これらの_pathヘルパーには、それぞれに対応する_urlヘルパー (photos_urlなど) があります。_urlヘルパーは、_pathの前に現在のホスト名、ポート番号、パスのプレフィックスが追加されている点が異なります。, リソースをいくつも定義しなければならない場合は、以下のような略記法で一度に定義することでタイプ量を節約できます。, ユーザーがページを表示する際にidを一切参照しないリソースが使われることがあります。たとえば、/profileでは常に「現在ログインしているユーザー自身」のプロファイルを表示し、他のユーザーidを参照する必要がないとします。このような場合には、単数形リソース (singular resource) を使ってshowアクションに (/profile/:idではなく) /profileを割り当てることができます。, to:の引数に文字列を渡す場合はコントローラ#アクション形式であることが前提ですが、シンボルを使う場合は、to:オプションをaction:に置き換えるべきです。#なしの文字列を使う場合は、to:オプションをcontroller:に置き換えるべきです。, Geocodersコントローラに割り当てられた以下の6つのルーティングを作成します。, 単数形リソースは複数形のコントローラに割り当てられます。これは、同じコントローラで単数形のルーティング (/account) と複数形のルーティング (/accounts/45) を両方使いたい場合を想定しているためです。従って、resource :photoとresources :photosのどちらも、単数形ルーティングと複数形ルーティングを両方作成し、同一のコントローラ (PhotosController) に割り当てられます。, 単数形のリソースフルなルーティングを使うと、以下のヘルパーメソッドが生成されます。, 複数形リソースの場合と同様に、単数形リソースでも_pathヘルパーに対応する_urlヘルパーが使えます。_urlヘルパーは、_pathの前に現在のホスト名、ポート番号、パスのプレフィックスが追加されている点が異なります。, コントローラを名前空間によってグループ化することもできます。最もよく使われる名前空間といえば、多数の管理用コントローラ群をまとめるAdmin::名前空間でしょう。これらのコントローラをapp/controllers/adminディレクトリに配置し、ルーティングでこれらをグループ化できます。, 上のルーティングにより、articlesコントローラやcommentsコントローラへのルーティングが多数生成されます。たとえば、Admin::ArticlesController向けに作成されるルーティングは以下のとおりです。, 例外的に、(/adminが前についていない) /articlesをAdmin::ArticlesControllerにルーティングしたい場合は、以下のようにすることもできます。, 逆に、/admin/articlesを (Admin::なしの) ArticlesControllerにルーティングしたい場合は、以下のようにします。, いずれの場合も、名前付きルーティング (named route)は、scopeを使わなかった場合と同じであることにご注目ください。最後の例の場合は、以下のパスがArticlesControllerに割り当てられます。, namespaceブロックの内部で異なるコントローラ名前空間を使いたい場合、「get '/foo', to: '/foo#index'」のような絶対コントローラパスを指定することもできます。, 論理上、他のリソースの配下に子リソースを配置することはよくあります。たとえば、Railsアプリケーションに以下のモデルがあるとします。, ルーティングをネストする (入れ子にする) ことで、この親子関係をルーティングで表すことができるようになります。上の例の場合、以下のようにルーティングを宣言することができます。, 上のルーティングによって、雑誌 (magazine) へのルーティングに加えて、広告 (ad) をAdsControllerにルーティングすることもできるようになりました。adへのURLにはmagazineもなければなりません。, ルーティングを作成すると、ルーティングヘルパーも作成されます。ヘルパーはmagazine_ads_urlやedit_magazine_ad_pathのような名前になります。これらのヘルパーは、最初のパラメータとしてMagazineモデルのインスタンスを1つ取ります (magazine_ads_url(@magazine))。, ただしリソースのネストが深くなるとたちまち扱いにくくなります。たとえば、上のルーティングはアプリケーションで以下のようなパスとして認識されます。, このURLに対応するルーティングヘルパーはpublisher_magazine_photo_urlとなります。このヘルパーを使うには、毎回3つの階層すべてでオブジェクトを指定する必要があります。ネスティングが深くなるとルーティングが扱いにくくなる問題については、Jamis Buckの有名な 記事 を参照してください。JamisはRailsアプリケーション設計上の優れた経験則を提案しています。, リソースのネスティングは、ぜひとも1回にとどめて下さい。決して2回以上ネストするべきではありません。, 前述したような深いネストを避けるひとつの方法として、コレクション (index/new/createのような、idを持たないアクション) だけを親のスコープの下で生成するという手法があります。このとき、メンバー (show/edit/update/destroyのような、idを必要とするアクション) をネストに含めないのがポイントです。これによりコレクションだけが階層化のメリットを受けられます。つまり、以下のように最小限の情報でリソースを一意に指定できるルーティングを作成するということです。, この方法は、ルーティングの記述を複雑にせず、かつ深いネストを作らないという絶妙なバランスを保っています。:shallowオプションを使うことで、上と同じ内容をさらに簡単に記述できます。, これによって生成されるルーティングは、最初の例と完全に同じです。親リソースで:shallowオプションを指定すると、すべてのネストしたリソースが浅くなります。, DSL (ドメイン固有言語) であるshallowメソッドをルーティングで使うと、すべてのネストが浅くなるように内側にスコープを1つ作成します。これによって生成されるルーティングは、最初の例と完全に同じです。, scopeメソッドには、「浅い」ルーティングをカスタマイズするためのオプションが2つあります。:shallow_pathオプションは、指定されたパラメータをメンバーのパスの冒頭にだけ追加します。, :shallow_prefixオプションを使うと、指定されたパラメータを (パスではなく) 名前付きルーティングヘルパー名の冒頭に追加します。, concernを使うことで、他のリソースやルーティング内で使いまわせる共通のルーティングを宣言できます。concernは以下のように定義します。, concernを利用すると、同じようなルーティングを繰り返し記述せずに済み、複数のルーティング間で同じ動作を共有できます。, concernはルーティング内のどの場所にでも配置できます。scopeやnamespace呼び出しでは以下のように利用できます。, ルーティングヘルパーを使う方法の他に、パラメータの配列からパスやURLを作成することもできます。例として、以下のようなルーティングがあるとします。, magazine_ad_pathを使うと、idを数字で渡す代りにMagazineとAdのインスタンスを引数として渡すことができます。, 複数のオブジェクトが集まったセットに対してurl_forを使うこともできます。複数のオブジェクトを渡しても、適切なルーティングが自動的に決定されます。, 上の場合、Railsは@magazineがMagazineであり、@adがAdであることを認識し、それに基づいてmagazine_ad_pathヘルパーを呼び出します。link_toなどのヘルパーでも、完全なurl_for呼び出しの代りに単にオブジェクトを渡すことができます。, それ以外のアクションであれば、配列の最初の要素にアクション名を挿入するだけで済みます。, これにより、モデルのインスタンスをURLとして扱うことができます。これはリソースフルなスタイルを採用する大きなメリットの1つです。, デフォルトで作成されるRESTfulなルーティングは7つですが、7つでなければならないということはありません。必要であれば、コレクションやコレクションの各メンバーに対して適用されるリソースを追加することもできます。, メンバー (member) ルーティングを追加したい場合は、memberブロックをリソースブロックに1つ追加します。, 上のルーティングはGETリクエストとそれに伴う/photos/1/previewを認識し、リクエストをPhotosコントローラのpreviewアクションにルーティングし、リソースid値をparams[:id]に渡します。同時に、preview_photo_urlヘルパーとpreview_photo_pathヘルパーも作成されます。, memberルーティングブロックの内側では、認識させるHTTP動詞をルーティング名ごとに指定します。指定可能なHTTP動詞はget、patch、put、post、deleteです。memberルーティングが1つだけしかない場合は、以下のようにルーティングで:onオプションを指定することでブロックを省略できます。, :onオプションを省略しても同様のmemberルーティングが生成されます。この場合リソースidの値の取得にparams[:id]ではなくparams[:photo_id]を使う点が異なります。ルーティングヘルパーも、preview_photo_urlがphoto_preview_urlに、preview_photo_pathがphoto_preview_pathにそれぞれリネームされます。, ルーティングにコレクション (collection) を追加するには以下のようにします。, 上のルーティングは、GETリクエスト+/photos/searchなどの (idを伴わない) パスを認識し、リクエストをPhotosコントローラのsearchアクションにルーティングします。このときsearch_photos_urlやsearch_photos_pathルーティングヘルパーも同時に作成されます。, collectionルーティングでもmemberルーティングのときと同様に:onオプションを使えます。, 第1引数としてresourceルーティングをシンボルで定義する場合は、文字列で定義した場合と同等ではなくなる点にご注意ください。文字列はパスとして推測されますが、シンボルはコントローラのアクションとして推測されます。, :onオプションを使って、たとえば以下のように別のnewアクションを追加できます。, 上のようにすることで、GET + /comments/new/previewのようなパスが認識され、Commentsコントローラのpreviewアクションにルーティングされます。preview_new_comment_urlやpreview_new_comment_pathルーティングヘルパーも同時に作成されます。, リソースフルなルーティングにアクションが多数追加されていることに気付いたら、それ以上アクションを追加するのをやめて、そこに別のリソースが隠されているのではないかと疑ってみる方がよいでしょう。, Railsではリソースルーティングを行なう他に、任意のURLをアクションにルーティングすることもできます。この方式を使う場合、リソースフルルーティングのような自動的なルーティンググループの生成は行われません。従って、アプリケーションで必要なルーティングを個別に設定することになります。, 基本的にはリソースフルルーティングを使用すべきではありますが、このような単純なルーティングの方が適している箇所も多数あるはずです。リソースフルルーティングでは大袈裟過ぎる場合に、アプリケーションを無理にリソースフルなフレームワークに押し込める必要はありません。, シンプルルーティングは、特に従来形式のURLを新しいRailsのアクションに割り当てることがずっと簡単に行えるようになります。, 通常のルーティングを設定するのであれば、RailsがルーティングをブラウザからのHTTPリクエストに割り当てるためのシンボルをいくつか渡します。以下のルーティングを例にとってみましょう。, ブラウザからの/photos/1リクエストが上のルーティングで処理される (他のルーティング設定にはマッチしなかったとします) と、PhotosControllerのdisplayアクションが呼び出され、URL末尾のパラメータ"1"へのアクセスはparams[:id]で行なえます。:idが必須パラメータではないことがかっこ () で示されているので、このルーティングは/photosをPhotosController#displayにルーティングすることもできます。, 通常のルーティングの一部として、文字列を固定しない動的なセグメントを自由に使えます。あらゆるセグメントはparamsの一部に含めてアクションに渡すことができます。以下のルーティングを設定したとします。, ブラウザからの/photos/1/2パスはPhotosControllerのshowアクションに割り当てられます。params[:id]には"1"、params[:user_id]には"2"がそれぞれ保存されます。, 動的なセグメント分割ではドット.をデフォルトでは使えません。ドットはフォーマット済みルーティングでは区切り文字として使用されるためです。どうしても動的セグメント内でドットを使いたい場合は、デフォルト設定を上書きする制限を与えます。たとえばid: /[^\/]+/とすると、スラッシュ以外のすべての文字が使えます。, ルート作成時にコロンを付けなかった部分は、静的なセグメントとして固定文字列が指定されます。, 上のルーティングは、/photos/1/with_user/2のようなパスにマッチします。このときアクションで使えるparamsは { controller: 'photos', action: 'show', id: '1', user_id: '2' }となります。, クエリ文字列 (訳注: ?パラメータ名=値の形式でURLの末尾に置かれるパラメータ) で指定されているパラメータもすべてparamsに含まれます。以下のルーティングを例にとってみましょう。, ブラウザからのリクエストで/photos/1?user_id=2というパスが渡されると、Photosコントローラのshowアクションに割り当てられます。このときのparamsは{ controller: 'photos', action: 'show', id: '1', user_id: '2' }となります。, :defaultsオプションにハッシュを1つ渡すことで、ルーティング内にデフォルトを定義できます。このとき、動的なセグメントとして指定する必要のないパラメータを次のように適用することも可能です。, 上のルーティングはブラウザからの/photos/12パスにマッチし、Photosコントローラのshowアクションに割り当てられます。, defaultsをブロック形式で使うと、複数の項目についてデフォルトを設定することもできます。, セキュリティ上の理由により、クエリパラメータでデフォルトをオーバーライドすることはできません。URLパスの置き換えによる動的セグメントのみ、オーバーライド可能です。, 上のルーティングではlogout_pathとlogout_urlがアプリケーションの名前付きルーティングヘルパーとして作成されます。logout_pathを呼び出すと/exitが返されます。, この方法を使って、リソースとして定義されているルーティングを以下のように上書きすることもできます。, 上のルーティングではuser_pathメソッドが生成され、コントローラ・ヘルパー・ビューでそれぞれ使えるようになります。このメソッドは、/bobのようなユーザー名を持つルーティングに移動します。Usersコントローラのshowアクションの内部でparams[:username]にアクセスすると、ユーザー名を取り出すことができます。パラメータ名を:usernameにしたくない場合は、ルーティング定義の:usernameの部分を変更してください。, あるルーティングを特定のHTTP動詞に割り当てるために、通常はget、post、put、patch、deleteメソッドのいずれかを使う必要があります。matchメソッドと:viaオプションを使うことで、複数のHTTP動詞に同時にマッチするルーティングを作成できます。, via: :allを指定すると、すべてのHTTP動詞にマッチする特別なルーティングを作成できます。, 1つのアクションにGETリクエストとPOSTリクエストを両方ルーティングすると、セキュリティに影響する可能性があります。本当に必要な理由がない限り、1つのアクションにすべてのHTTP動詞をルーティングすることは避けてください。, RailsではGETのCSRFトークンをチェックしません。決してGETリクエストでデータベースに書き込んではいけません。詳しくはセキュリティガイドのCSRF対策を参照してください。, :constraintsオプションを使って、動的セグメントのURLフォーマットを特定の形式に制限できます。, 上のルーティングは/photos/A12345のようなパスにはマッチしますが、/photos/893にはマッチしません。以下のようにもっと簡潔な方法で記述することもできます。, :constraintsでは正規表現を使えますが、ここでは正規表現の「アンカー」は使えないという制限があることにご注意ください。たとえば、以下のルーティングは無効です。, 対象となるルーティングはすべて初めからアンカーされているので、このようなアンカー表現を使う必要はないはずです。, たとえば以下のルーティングでは、ルート (root) 名前空間を共有する際にarticlesに対してto_paramが1-hello-worldのように数字で始まる値だけが使えるようになっており、usersに対してto_paramがdavidのように数字で始まらない値だけが使えるようになっています。, また、Stringを返すRequestオブジェクトの任意のメソッドに基いてルーティングを制限することもできます。, リクエストに応じた制限は、セグメントを制限するときと同様の方法で指定することができます。, リクエストベースの制限は、Requestオブジェクトに対してあるメソッドを呼び出すことで実行されます。メソッド呼び出し時にハッシュキーと同じ名前をメソッドに渡し、返された値をハッシュ値と比較します。従って、制限された値は、対応するRequestオブジェクトメソッドが返す型と一致する必要があります。たとえば、constraints: { subdomain: 'api' }という制限はapiサブドメインに期待どおりマッチしますが、constraints: { subdomain: :api }のようにシンボルを使った場合はapiサブドメインに一致しません。request.subdomainが返す'api'は文字列型であるためです。, formatの制限には例外があります。これはRequestオブジェクトのメソッドですが、すべてのパスに含まれる暗黙的なオプションのパラメータでもあります。formatの制限よりセグメント制限が優先されます。たとえば、get 'foo'、constraints: { format: 'json' }はGET /fooと一致します。これはデフォルトでformatがオプションであるためです。しかし、次のようにlambdaを使うことができます。get 'foo', constraints: lambda { |req| req.format == :json } このルーティング指定は明示的なJSONリクエストにのみ一致します。, より高度な制限を使いたい場合、Railsで必要なmatches?に応答できるオブジェクトを渡す方法があります。例として、制限リストに記載されているすべてのユーザーをRestrictedListControllerにルーティングしたいとします。この場合、以下のように設定します。, matches?メソッドおよびlambdaはいずれも引数としてrequestオブジェクトを取ります。.