blog

紫陽花

Rails Routing Constraints

Constraintsとは

  • Railsのroutingに存在する機能
  • routingに制限を設けることができる
  • デフォルトで定義されている
  • カスタムで制約を作成することも可能

セグメントの制限

get "books/:id" => "photos#show", constraints: { id: /[A-Z]\d{5} }

上記はconstraintsでidに制約を追加している。 /books/A12345 のようなパスにはマッチするが、 /books/12345にはマッチしない。

リクエストに応じた制限

get "books", constraints: { subdomain: "admin" }

サブドメインadminが含まれていることを制限している。

ブロックでも表現できる。

namespace :admin do
  constraints subdomain: 'admin' do
    resources :photos
  end
end

カスタムconstraints

制約用のクラスを設けて対応する lib/constraint以下にクラスを置く self.matches?メソッド内に制約を定義する 下記ではrequestを引数で取り、その中に、admin が含まれているかどうかを判定する

module Constraint::Subdomain
  class Admin
    def self.matches?(request)
      request.subdomains.include?("admin")
    end
  end
end

ルーティング側には下記のように定義することで制約を加える

Rails.application.routes.draw do
  constraints Constraint::Subdomain::Admin do
    get "dashboard" => "homes#dashboard"
  end
end

dashboardへのリクエストパスのサブドメインにadminが含まれているかを判定する