2011-10-26 13 views
0

ユーザーがカスタムURLを設定し、私たちの "content_pages"コントローラにルーティングするCMSスタイルのアプリケーションがあります。ワイルドカードルートのフォーマット制約

これをサポートするために、3つのワイルドカードルートが定義されています。

これらのワイルドカードは、フォーマットがhtml、json、xmlなどのリクエストにのみ応答するように制約しています。これは、欠けているfavicon.icoが一連のクエリとWebリクエストをもたらすという問題から生まれます。なぜなら、それはcontent_pagesコントローラにルーティングされ、次に404にルーティングされるからです。

これまで私がこれまで持っていたことはありますが、制約は単に機能しません。 (ファビコンまだルート)

get "/:id/edit", to: "content_pages#edit", :constraints => {:id => /.*/, :format => "[html|xml|json]"}, as: :edit_content_page                           
put "/:id", to: "content_pages#update", :constraints => {:id => /.*/, :format => "[html|xml|json]"}, as: :content_page 
get "/:id", to: "content_pages#show", :constraints => {:id => /.*/, :format => "[html|xml|json]"}, as: :content_page 

私は、カスタムの制約クラスにこれを入れてみましたが、その後ここに含まアレントcontent_pages上のアクションは、(のような/ content_pagesどのインデックスへのルート)レンダリングされません。

これは、他のアクションを結びつける以前のリソースステートメントです。

resources :content_pages, except: [:get, :edit, :update] do 
    collection do 
    get :get_url 
    end 
end 

私がこの制約をどのようにすることができるかについての考えは、他の拘束されていない他のアクションを破ることなく適用されますか?

+0

あなたの ':id'制約がおそらくidの一部としてフォーマットを摂っているので、:format制約は評価されていません。あなたは '/.*?/'のようなことをして正規表現を怠惰にしてフォーマットを食べることはできませんが、 '.ico'ファイルはまだ許可されます。本当に答えはありませんが、うまくいけばあなたに役立つ情報があります。 –

答えて

1

これは、あなたがルートを整理することを可能にする副次的な利点を持っている

get "/:id", to: "content_pages#show", :constraints => {:id => /.+?(?<!ico)/, :format => /(html|xml|json)/}, as: :content_page 
+0

技術的に私はイメージタイプを禁止したいと思っていましたが、私はそれを起こすことができると思います!(ico | jpg | jpeg | png) – JoshReedSchramm

1

最も簡単な解決方法は、空白を公開ディレクトリに置くことです。その後、明示的に除外するために、あなたの:id制約を更新することができ、除外したいファイル・タイプだけが.icoある場合

get "/:id/edit", to: "content_pages#edit", as: :edit_content_page                           
put "/:id", to: "content_pages#update", as: :content_page 
get "/:id", to: "content_pages#show", as: :content_page