rails 正しい日付のみ通すルーティング

たとえば、以下のようなルーティングを定義している場合には /2010/13 などは存在しない日付なわけで。。

/yyyy/m?m

存在しない日付の場合は 404 かなんかを返さなければいけない。

コントローラでやってもいいけど、ルーティングだけでできないだろうか。。
constraintsオプションにはlambdaを指定できるらしいのでやってみた。

get '/:year/:month' => 'site#index', constraints: lambda { |request|
  Date.valid_date?(request.params[:year].to_i, request.params[:month].to_i, 1)
}

lambdaの中でtrueを返せばルーティングが通るので、これで良いっぽい。

同様に、/yyyy/m?m/d?dのルーティングを作りたければ、

get '/:year/:month/:day' => 'site#index', constraints: lambda { |request|
  Date.valid_date?(request.params[:year].to_i, request.params[:month].to_i, reuqest.params[:day].to_i)
}

ということ。
ルーティングでこんなことまできるとはな・・。

タイトルとURLをコピーしました