2016.03.29この記事は約15分で読めます。railsのルーティング周りについて、自分自身がルーティング設定をする時に迷わないようにするため、また内部でどのような処理がされているのかをイメージしながら設定を書けるようになるため、調べた内容をまとめてみる。最初は、ネストしたルーティングの設定の仕方がよくわからなかったが、スコープを意識することで定義したいリソースを生成したい場合にどのようにルーティングを設定すればよいのかが段々とわかるようになってきた。rails-4.2.5で動作確認した内容です。間違いがあれば、コメント等でお知らせいただけますと幸いです。サンプルコードは、特に実用性を深く考慮したものではないです。参考リンクルーターの役割ルーターは,PATH_INFOの情報をもとに、HTTPリクエストを適切なコントローラーのアクションへディスパッチする(正確には、通常Dispatcherオブジェクトがdispatchする)。以下のような設定を考えてみる。/books/1のようなHTTPリクエストを送ると、books_controllerのshowメソッドにディスパッチされる。1ルーティング設定getやpostなどのHTTPメソッド宣言やmatchのような宣言でURLパターンを記述したり、resourcesやresourceのリソーススコープとcollectionやmemberなどのスコープレベルを組み合わせたりすることでルーティングを設定していく。resourcesリソースフルな一連のルーティングを生成する。デフォルトで以下のアクションが用意されている。@api_onlyは,rails5からAPI機能に特化した開発を行なうために追加されたオプションであり,apiモードの時に生成されるアクションでは:newや:editが含まれない形になっている。:edit]endendresourcesを使って以下のような設定をすると、上記のデフォルトアクションに対応するルーティングが生成される。:booksこの設定により以下のルーティングが生成される。books#destroyparamセグメント:idは、paramオプションで変えることもできる。:no上記設定により以下のようなルーティングが生成される。books#destroyonly、exceptonlyやexceptオプションを使うと、ルーティングを特定のアクションに限定したり、ルーティングから特定のアクションを除外したりすることができる。以下はonlyオプションを使って:showアクションのみに限定した場合の例。[:show]以下のルーティングが生成される。member、newresourcesは、newおよび後述するcollectionとmemberを使っても同じように設定を記述することができる。実際、resourcesは呼び出しの中でこれらのスコープを使っている。:booksと同様のルーティングが生成されるのを確認できる(実際にはこのような書き方はしないだろう。'books#destroy'endendnestednestedスコープは、resourcesスコープで:#{singular}_#{param}の動的パスセグメントを生成する。以下ではパス/reviewsに対して、:book_idという動的パスセグメントを生成している。'reviews#index'end以下のルーティングが生成される。books#destroy:book_idでなく:idを使いたい場合は、memberスコープにすればよい。:memberendresource単数形リソース(id参照を必要としないリソース)を使用する時に使う。デフォルトで以下のアクションが用意されている。:edit]end例えば、ログインしているユーザーに対するリソースフルな一連のルーティングを生成したい場合、以下のように設定できる。:user上記設定により生成されるルーティングは以下のようになる。users#destroyindexアクションのルーティングが含まれない点が、resourcesと異なる。スコープで生成されるリソースActionDispatch::RoutingモジュールのMapper::Resources::Resource(resourcesで呼ばれる)やMapper::Resources::SingletonResourceクラス(resourceで呼ばれる)を見ると、各スコープでどのようなパスセグメントが生成されるのか把握することができる。www.omniref.com以下表にまとめてみる。:destroy例えば以下の設定例では、下表のようになる。/books/:book_id/reviewscollectionid参照のないリソースを使用したい時に使う。resourcesまたはresourceのスコープ外で宣言するとArgumentErrorになる。上記は以下のようにも書ける。上記は以下のようにも書ける。:collectionend以下のルーティングが生成される。books#destroymemberid参照のあるリソースを使用したい時に使う。resourcesまたはresourceのスコープ外で使うとArgumentErrorになる。上記は以下のようにも書ける。上記は以下のようにも書ける。:memberend以下のルーティングが生成される。books#destroyちなみに、memberを使わないと以下のルーティングとなる。books#destroypathヘルパーメソッドのprefixおよび動的パスセグメント名が異なっているので注意。rootアプリケーションルートのルーティングを生成する。以下の3つの定義は同じとなるが、1)の書き方が最もシンプル。'welcome#index'namespaceやscope内でも宣言することができる。以下はscopeのブロック内で、3)の設定をしたことと同じである。'admin#index'end以下のルーティングが生成される。admin#indexHttpHelpersHttpHelpersモジュールには、代表的なHTTPメソッドのヘルパーメソッドが定義されている。これらのメソッドを使ってresourcesで生成されるルーティングの設定を記述すると以下のようになる。'books#destroy'matchHttpHelpersモジュールのメソッドは内部でこのメソッドを呼んでいる。getやpostでは、呼び出しに対応するHTTPメソッドが1つに決定されるが、matchではviaオプションを使って複数のHTTPメソッドに対応するルーティングを生成することができる。:patch]以下のルーティングが生成される。books#updateanchoranchorオプションをfals`に設定すると、pathで始まるリソースに一致するリクエスト全てで有効となる。:getscope様々なスコープを作り、ルーティング設定を記述することができる。ここでのオプションは、matchやresourcesでも同様に使うことができる。'/books'オプションを保持したスコープを作り、そのスコープ内でさらにgetメソッドを使ってルーティングを設定している。'book'end以下のルーティングが生成される。somethingendasスコープ内でasオプションで指定される値をpathヘルパーメソッドのprefixに追加する。somethingend以下では、pathオプションを保持するスコープでasオプションを使ってpathヘルパーメソッドのprefixをそれぞれbooksとbookに設定している。'books#destroy'endend以下のルーティングが生成される。books#destroycontrollerスコープ内でcontrollerオプションで指定されるcontrollerを使う。somethingend以下では、path、controller、asの3つのオプションを保持したスコープを作り、その中でいくつかのルーティングを設定している。:createend以下のルーティングが生成される。books#createactionスコープ内でactionオプションで指定されるactionを使う。somethingend以下では、path、controller、action、asの4つのオプションを保持したスコープを作り、ルーティングを設定している。:patch]end以下のルーティングが生成される。books#updatemoduleスコープ内でmoduleオプションで指定されるmoduleを使う。somethingend以下では、path、module、asの3つのオプションを保持したスコープを作り、adminモジュールのadminコントローラーのindexアクションに対するルーティングを設定している。'admin#index'end以下のルーティングが生成される。admin/admin#indexshallow_pathスコープ内でshallow_pathオプションで指定される値を、shallowオプションが指定されているリソースのメンバーリソース(id参照のある)の先頭に追加する。somethingend以下では、reviewsの一連のid参照をするリソースにunpublishedというパスセグメントを追加している。books#destroyshallow_prefixスコープ内でshallow_prefixオプションで指定される値を、shallowオプションが指定されているリソースのメンバーリソース(id参照のある)に対応するpathヘルパーメソッドのprefixに追加する。somethingend以下の例では、unpublishedをpathヘルパーメソッドのprefixに追加している。trueendend以下のルーティングが生成される。books#destroypath_namespath_namesオプションで指定される値で、newやeditなどの自動生成されるパスセグメントをオーバーライドする。:booksend以下のルーティングが生成される。books#destroyshallow浅いネストを設定する。:votesendendend以下のルーティングが生成される。books#destroyconstraints通常Dispatcherがルーティングエンドポイントとなっているところに、一層処理を挟む形となる。これを利用すると、動的パスセグメントのURL形式に特定の制約を課すことができる。constraintsオプションのHashキーには、Requestクラスのメソッド名を指定することもでき、その場合、valueはメソッドの返り値の型と一致させる必要がある。somethingendidパラメータが数値のみを許可する例。'books#destroy'end以下のルーティングが生成される。{:id=>/\d+/}ローカルからのリクエストの時のみ許可する例。Requestクラスのlocal?メソッドを使う。www.omniref.comconstraintsに任意のオブジェクトを指定するmatches?メソッドに応答するオブジェクトを指定することができる。'smartphones#index'endProcやlambdaなどのcallに応答するオブジェクトを指定することもできる。'local#index'end以下のルーティングが生成される。books#indexdefaultsパラメータのデフォルト値を設定する。'book'end以下のルーティングが生成される。somethingendscopeで以下のように書いたのと同じになる。somethingendconcernルーティング設定を再利用することができる。resourcesやresourceのオプションで指定できる。:attachable以下のルーティングが生成される。users#destroyRackアプリケーションの指定toオプションにrackアプリケーションを指定することができる。:all以下のようなルーティングが生成される。#<MyApp:0x007fa4d0c7def0>コントローラーのアクションもrackのエンドポイントtoには、アクションを直接指定することもできる。BooksController.action(:index)redirecttoオプションにredirectを使うと、動的セグメントを利用してリダイレクトさせることができる。'author'以下のルーティングが生成される。book)mountアプリケーションにRackアプリケーションやEngineをマウントすることができる。内部では、matchが呼び出されている。'/myapp'Ex3の例では、以下のルーティングが生成され、/myappでアプリケーションにアクセスすることができる。#<MyApp:0x007fa4cba5a790>ルーティング適用の順番ルーティングは、先に設定しているものが優先される。redirect_uri_mismatchになるrails4でomniauth-google-oauth2を使ってソーシャルログイン機能を実装していたところ、以下のエラーでコールバック処理が実行されない。この時の設定内容は以下のとおり。コメントをキャンセルメールアドレスが公開されることはありません。»タイトルとURLをコピーしました。