Как определить целое число в маршрутах Rails 3? - PullRequest
3 голосов
/ 18 января 2012

Я бы хотел добавить небольшой бит дополнительной логики в rotues.rb, который, вероятно, там не принадлежит, но, кажется, для меня это имеет смысл.

У меня два противоречивых маршрута. Быть примитивным:

match '/videos/:browseby' => 'videos#browse', :as => "browse_by"

Где: browseby ищет строку, например «Теги», для просмотра видео по тегам.

Однако (и, скорее всего, это произошло) у меня также есть основной ресурс для шоу (снова в примитивной форме):

match '/videos/:id' => 'videos#show', :as => "video"

Где: id ищет целое число для идентификатора видео.

Есть ли способ добавить небольшой кусочек логики, такой как ...

match '/videos/:id' => 'videos#show', :as => "video", :format(:id) => :integer

(Это мой гипотетический синтаксис рельсов, чтобы показать, что я ищу.)

Я знаю, что могу сделать это на уровне контроллера, но для меня имеет больше смысла обрабатывать его на уровне маршрута.

1 Ответ

5 голосов
/ 18 января 2012

Вы можете попробовать использовать :constraints и регулярное выражение:

match '/videos/:id' => 'videos#show', :as => "video", :constraints => { :id => /\d/ }
match '/videos/:browseby' => 'videos#browse', :as => "browse_by"

Вы также должны убедиться, что более слабая версия :browseby выходит после версии :id.Обратите внимание, что ограничения регулярных выражений неявно привязаны в начале , так что это будет работать до тех пор, пока ваши :browseby значения не начинаются с цифры.

Если у вас есть теги, которые начинаются счисла, тогда вы можете использовать объект для ограничения , а затем вы можете включить якоря в свое регулярное выражение:

class VideoIdsOnly
    def matches?(request)
        request.path =~ %r{\A/videos/\d+\z}
    end
end

match '/videos/:id' => 'video#show', :as => "video", :constraints => VideoIdsOnly.new
match '/videos/:browseby' => 'videos#browse', :as => "browse_by"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...