Вы должны использовать промежуточное программное обеспечение Rack, чтобы перехватить запрос, а затем переписать URL-адрес для вашего правильного приложения Rails. Таким образом, ваши файлы маршрутов остаются очень простыми.
map.resources :section
map.resources :articles
В промежуточном программном обеспечении вы ищите сущность, связанную с путем, и переназначаете URL-адрес на простой внутренний URL-адрес, позволяя маршрутизации Rails отправлять на правильный контроллер и вызывая цепочку фильтров нормально.
Обновление
Вот простое пошаговое руководство по добавлению такого рода функциональности с использованием Rails Metal компонента и предоставленного вами кода. Я предлагаю вам взглянуть на упрощение поиска сегментов пути, поскольку вы дублируете большую часть работы с базой данных с текущим кодом.
$ script/generate metal path_rewriter
create app/metal
create app/metal/path_rewriter.rb
path_rewriter.rb
# Allow the metal piece to run in isolation
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
class PathRewriter
def self.call(env)
path = env["PATH_INFO"]
new_path = path
if article = Article.find_by_path(path)
new_path = "/articles/#{article.id}"
elsif section = Section.find_by_path(path)
new_path = "/sections/#{section.id}"
end
env["REQUEST_PATH"] =
env["REQUEST_URI"] =
env["PATH_INFO"] = new_path
[404, {"Content-Type" => "text/html"}, [ ]]
end
end
Для хорошего знакомства с Metal и Rack в целом, посмотрите эпизод Ryan Bates 'Railscast на Metal и эпизод на Rack .