通配符路由中的格式约束

时间:2011-10-26 20:21:14

标签: ruby-on-rails ruby-on-rails-3 url-routing

我有一个CMS样式应用程序,用户可以在其中设置自定义URL并将其路由到我们的“content_pages”控制器。

为了支持这一点,我们定义了3个通配符路由。

我正在尝试约束这些通配符,以便它们只响应格式为html,json或xml的请求,而不是其他任何内容。这源于一个问题,即缺少favicon.ico会导致一系列查询和Web请求,因为它会路由到content_pages控制器,然后是404s。

这是我到目前为止所拥有的,但约束根本不起作用。 (favicon仍然路线)

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

如何在不违反我们的其他非约束行为的情况下对我如何制定此约束的任何想法都适用?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您要排除的唯一文件类型是.ico,那么您可以更新:id约束以明确排除它:

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