9

のようなルートを処理する必要があり/: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たものを制約に対してチェックする方法はありますか、それとも制約を緩めるか手動で行う必要がありますか?

4

1 に答える 1

0

制約にラムダを使用して、この方法でエンコーディングを変更できます ( http://www.intridea.com/blog/2011/2/21/use-lambdas-for-rails3-route-constraintsから):

scope :constraints => lambda{|req| !req.session[:user_id].blank? } do
  # all my logged in routes
end
于 2013-11-01T14:33:53.740 に答える