Railsで、/skills/react.js
みたいな、ドット入りのURLを実現したいとき。
ドットはhtmlやjsonなどのフォーマットを表すのに利用するため、例えば
config/routes
get "/skills/:name" => "skills#show"
と書いて、/skills/react.js
にアクセスしてもうまくいかない。
ログを見ると、ドット以降のURLは省かれ、Parameters: {"name"=>"react"}
となっているのが分かる。(ホントはparams[:name]
に"react.js"
が入ってほしい)
これを回避するには、:constraints
オプションを利用して、動的セグメント部分(:name
)のフォーマットに制約を付ける。
上記のルーティングを以下のように変更する。
config/routes
get "/skills/:name" => "skills#show", constraints: { name: /[^\/]+/ }
:name
の部分に許可する文字列を正規表現で指定。上の例だとスラッシュ以外の文字列を許可したことになる。
再度アクセスすると、Parameters: {"name"=>"react.js"}
になっており、ドット入りの動的URLを利用することが可能になっているのが分かる。