Railsで小数点を含むURLのrouting設定
Rails3.2で小数点を含んだURLのrouting設定をしようとした際に、デフォルトの設定だとRoutingErrorになってしまいました。
ピリオド(.)を含むURLを設定したい場合にはconstraintsを使用する必要があるようです。
例)以下のようにURLのバージョン番号に応じて表示を切り替えるAPIがあった場合
http://example.com/api/1.1/version
config/routes.rb
namespace :api do
post ':app_version/version' => 'version#show'
end
routes.rbを上記のように設定しても
ActionController::RoutingError (No route matches [POST] "/api/1.1/version"):
と、エラーになってしまいます。
これを回避するにはrouting設定に:constraintsを追加します。
app_versionには小数点を含めた値が入ることを正規表現で記述します。
config/routes.rb
namespace :api do
post ':app_version/version' => 'version#show', :constraints => { :app_version => /([1-9]\d*|0)(\.\d+)?/ }
end
これで小数点を含むURLに対応できました。
バージョンの構造が更に深い場合(1.1.1など)は
namespace :api do
post ':app_version/version' => 'version#show', :constraints => { :app_version => /([1-9]\d*|0)(\.\d+)?(\.\d+)?/ }
end
正規表現を調整することで対応できます。
もっと深い構造の場合はどう正規表現を書くのがいいのでしょうか。
今のところ(.\d+)?をどんどん追加していく方法しか思いついていません。。。
よい記述方法があればアドバイスください。
2013/11/22 追記 @hnakamur2さんからアドバイスいただき、
config/routes.rb を
namespace :api do
post ':app_version/version' => 'version#show', :constraints => { :app_version => /\d+(\.\d+)*/ }
end
とすれば深いバージョン構造でもうまくRoutingすることができました。
@hnakamur2さん、ありがとうございます!