У меня есть две разные модели, которые могут отображаться в категории.В моем rout.rb я хотел бы иметь что-то вроде этого:
ActionController::Routing::Routes.draw do |map|
map.top_list ':category/:foo', :controller => 'foo', :action => 'show'
map.top_list ':category/:bar', :controller => 'bar', :action => 'show'
end
Это прекрасно работает, когда я загружаю URL-адрес типа "/ some-category-name / some-foo-name ", где" some-foo-name "может быть загружено FooController следующим образом:
class FooController < ApplicationController
def show
@foo = Foo.find_by_url! params[:foo]
end
end
Но когда я пытаюсь запросить Bar, например" / some-category-name-name / some-bar-name ", я получаю" ActiveRecord :: RecordNotFound в FooController # show ".Я знаю, что могу решить эту проблему, требуя, чтобы все имена Foo начинались с «foo-», а все имена баров начинались с «bar-», а затем определяли маршруты следующим образом:
ActionController::Routing::Routes.draw do |map|
map.top_list ':category/:foo', :controller => 'foo', :action => 'show', :requirements => { :name => /^foo-/ }
map.top_list ':category/:bar', :controller => 'bar', :action => 'show', :requirements => { :name => /^bar-/ }
end
Но с применением этого ограниченияпо именам довольно неоптимальный.Я обнаружил следующее, которое выглядит так: может работать на меня: Различные маршруты, но с использованием одного и того же контроллера для подклассов модели в Rails .Тем не менее, я не совсем следую примеру, поэтому я не знаю, решит ли это мою проблему.Также не очень хорошо, что мои Foo и BarController должны были бы наследовать от CategoryController.
Одна мысль, которая пришла мне в голову, это то, что я могу попытаться найти Foo, а затем вернуться к BarController, если это не удастся.Я легко могу сделать это в FooController и перенаправить на BarController, но это не совсем нормально, так как все запросы на Bars будут регистрироваться как FooController # show в журнале Rails.Однако, если бы я мог как-то настроить маршруты для вызова метода, чтобы определить, к чему направлять, основываясь на базовом имени URL, я мог бы получить поведение, которое мне нужно;Например,
ActionController::Routing::Routes.draw do |map|
is_a_foo = Proc.new {|name| Foo.find_by_url! name && true }
map.top_list ':category/:foo', :controller => 'foo', :action => 'show', :requirements => { :name => is_a_foo }
map.top_list ':category/:bar', :controller => 'bar', :action => 'show'
end
Есть ли способ сделать это в стандартном болоте Rails 2?