Второй вариант, с двумя маршрутами, почти наверняка является лучшим способом, потому что он будет соответствовать только тем типам URL, которые вы хотите поддерживать, в то время как первый вариант также будет "соответствовать" URL-адресам, таким как / documents / foo / bar, которая, скорее всего, приведет к тому, что ваш метод #common_query в лучшем случае вернет ответ RecordNotFound (404). В худшем случае, если вы не готовы увидеть ни один из ожидаемых параметров, вместо этого вы получите ошибку 500 ...
Конечно, если у вас много вариантов, у вас будет много маршрутов. И если вам нужно использовать их в комбинации, например, / documents / batch / 4 / tag / happy, вам нужно будет использовать маршрутный символ и выполнять обработку параметров в вашем контроллере. Это может выглядеть примерно так:
map.connect 'documents/*specs', :controller => "documents_controller", :action => "common_query"
Различные элементы URL будут доступны вашему контроллеру в виде params [: specs]. Вы можете превратить это в находку так:
@items = Item.find(:all, :conditions => Hash[params[:specs]])
Эта техника Hash [] преобразует одномерный массив опций в хеш-ключ-значение, что может быть полезно, даже если вы не передаете его напрямую в find ().