Ограничение формата в маршрутном символе - PullRequest
0 голосов
/ 27 октября 2011

У меня есть приложение в стиле CMS, в котором пользователь может установить собственный URL-адрес, и оно направляется на наш контроллер "content_pages".

Для поддержки этого мы определили 3 подстановочных маршрута.

Я пытаюсь ограничить эти подстановочные знаки, чтобы они отвечали только на запросы с форматом html, json или xml и ничем иным. Это связано с проблемой, когда отсутствующий файл favicon.ico приводит к серии запросов и веб-запросов, поскольку он направляется на контроллер content_pages, а затем на 404.

Вот что у меня есть, но ограничение просто не работает. (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 ]

1 голос
/ 27 октября 2011

Если единственный тип файла, который вы хотите исключить, это .ico, то вы можете обновить ограничение :id, чтобы явно исключить его:

get "/:id", to: "content_pages#show", :constraints => {:id => /.+?(?<!ico)/, :format => /(html|xml|json)/}, as: :content_page
1 голос
/ 27 октября 2011

Самое простое решение этого - поместить пустую строку 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...