【发布时间】:2011-01-24 13:16:32
【问题描述】:
我有两个不同的模型可以显示在一个类别中。在我的 routes.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
当我加载像“/some-category-name/some-foo-name”这样的 URL 时,这可以正常工作,其中“some-foo-name”可以由 FooController 加载,如下所示:
class FooController < ApplicationController
def show
@foo = Foo.find_by_url! params[:foo]
end
end
但是当我尝试请求一个栏时,例如“/some-category-name/some-bar-name”,我得到一个“ActiveRecord::RecordNotFound in FooController#show”。我知道我可以通过要求所有 Foo 名称以“foo-”开头并且所有 Bar 名称以“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
但是强制对名称进行这种限制是非常不理想的。我发现了以下内容,看起来它可能对我有用:Different routes but using the same controller for model subclasses in Rails。但是,我并没有完全遵循这个例子,所以我不知道这是否能解决我的问题。我的 Foo 和 BarController 必须从 CategoryController 继承也不是很好。
我想到的一个想法是,我可以尝试查找 Foo,然后如果失败则回退到 BarController。我可以轻松地在 FooController 中执行此操作并重定向到 BarController,但这并不是真的可以,因为所有对 Bars 的请求都将在 Rails 日志中记录为 FooController#show。但是,如果我可以以某种方式配置路由以调用方法来根据 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 中有什么方法可以做到这一点吗?
【问题讨论】:
-
如果下面的问题有答案,它也会回答这个问题:stackoverflow.com/questions/5767222/…