のようなルートを処理する必要があり/:slugます。スラッグは他の場所で一致するように制約されています。
\A[\p{Alnum}_.-]{3,}\z
明白なルート:
get '/:slug' => '...', :constraints => { :slug => /[\p{Alnum}_.-]{3,}/ }
get '/:slug' => '...', :slug => /[\p{Alnum}_.-]{3,}/
/mu-is-too-shortandのような ASCII URL では問題なく動作/where.is.pancakes.houseしますが、URL が の場合、すべてがうまくいきません/µ-is-too-short。ブラウザはこれをサーバーに送信しています:
/%C2%B5-is-too-short
%C2%B5-is-too-shortRails はエンコードされた を制約に対してチェックしようとしていますが、が ではない:slugため失敗しています。%\p{Alnum}
私は2つのクラッジを思いつきました:
get '/:slug' => '...', :slug => /.{3,}/
get '/:slug' => '...', :slug => /[^\/]+/, :constraints => lambda { |r| r.path_parameters[:slug].to_s =~ /\A[\p{Alnum}_.-]{3,}\z/ }
2 番目の:slug => /[^\/]+/in は、Rails が.bina.bをフォーマット拡張と見なさないようにするために必要です。
Rails を賢明に動作させ、デコードされ:slugたものを制約に対してチェックする方法はありますか、それとも制約を緩めるか手動で行う必要がありますか?