2010-05-11 123 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'