2010-05-11 79 views
7

Rails路由非常适合匹配REST风格'/' URL的分隔位,但是我可以在map.connect配置中匹配查询参数。我想要调用不同的控制器/操作,具体取决于'?'之后是否存在参数。Rails路由匹配查询参数

我是想这样的事情...

map.connect "api/my/path?apple=:applecode", :controller => 'apples_controller', :action => 'my_action' 
map.connect "api/my/path?banana=:bananacode", :controller => 'bananas_controller', :action => 'my_action' 

对于路由的目的,我不关心参数的值,只要它是提供给控制器的params哈希

+1

这可能将是真正棘手用做内置路由引擎,因为它仅处理请求的路径部分。查询参数由另一个层分析。可以使用Rack重新编写URL以使其可路由。 – tadman 2010-05-11 14:23:18

回答

1

除非有一个具体的原因,为什么你不能改变这一点,为什么不让它安静?

map.connect "api/my/path/bananas/:id, :controller => "bananas_controller", :action => "my_action"

如果你有很多参数,为什么不使用POSTPUT让你的参数不需要通过URL暴露?

10

以下解决方案基于“从外部导入路径”导轨(http://guides.rubyonrails.org/routing.html)中的“高级约束”部分。

在你的config/routes.rb文件中,包含识别器类有一个匹配?方法,如:

class FruitRecognizer 
    def initialize(fruit_type) 
    @fruit_type = fruit_type.to_sym 
    end 

    def matches?(request) 
    request.params.has_key?(@fruit_type) 
    end 
end 

然后使用对象从类作为布线约束,如:

map.connect "api/my/path", :contraints => FruitRecognizer.new(:apple), :controller => 'apples_controller', :action => 'my_action'