2011-10-26 88 views
0

我有一個CMS風格的應用程序,用戶可以在其中設置自定義網址並將其路由到我們的「content_pages」控制器。通配符路由中的格式約束條件

爲了支持這個,我們定義了3條通配符路由。

我試圖限制這些通配符,以便它們只響應格式爲html,json或xml而沒有其他的請求。這源於一個問題,即缺少favicon.ico會導致一系列查詢和Web請求,因爲它會路由到content_pages控制器,然後是404s。

這是我到目前爲止,但約束根本不起作用。 (圖標仍然路由)

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 

我也想對這裏的arent包括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

如果要排除的唯一文件類型是.ico,那麼你可以更新您的:id約束,明確排除:

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

從技術上講,我想禁止任何圖像類型,但我認爲我可以使這發生!(ico | jpg | jpeg | png)等 – JoshReedSchramm

1

最簡單的解決方法是在公共目錄中輸入空白favicon.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