2010-02-13 109 views
7

我有一個問題,我需要從GET請求傳入的值,我不知道如何設置路由定義。使用查詢字符串的路徑路由

我的類別對象有一個類型(字符串),顏色(字符串)和許多產品。我想創建一個簡單的Web服務,讓來電者通過傳遞類別和顏色來獲取類別的所有產品:

http://www.myapp.com/getProducts?catType=toy&color=red 

或?

http://www.myapp.com/categories/getProducts?catType=toy&color=red 

如何爲這種情況定義正確的路由?有沒有更好的方法來以一種安靜的方式來做到這一點...因爲我知道Rails是Restful的,所以如果有一種方法可以「正確地」做到,那就更好了。

感謝

回答

11

你的第一個例子:

map.getproduct '/getProduct', :controller => 'your_controller', :action => 'your_action' 

在控制器,你將有catType和顏色PARAMS哈希:

params[:catType] 
=> 'toy' 
params[:color] 
=> 'red' 

有沒有更好的辦法?可能是的,但這取決於你的需求。如果你將永遠有catType和顏色參數,比你可以像這樣添加路由:

map.getproduct '/getProduct/:catType/:color', :controller => 'your_controller', :action => 'your_action' 

您將有機會獲得使用參數散列這些參數就像在前面的例子。而您的網址看起來就像這樣:

www.myapp.com/getProduct/toy/red 

如果你的參數可能會改變,你可以使用通配符路線:

map.getproduct '/getProduct/*query', :controller => 'your_controller', :action => 'your_action' 

然後,它會趕上,在開始時有www.my.app.com/getProduct/...所有請求。但是你會在控制器中做更多的工作。您將有與此訪問query

params[:query] 

www.myapp.com/getProduct/color/red/catType/toy它會給:

params[:query] 
=> ['color', 'red', 'catType', 'toy] 

所以,你必須manualy解析它。

+0

太好了...... Restful方法正是我想要的!檢查並投票。 – 2010-02-15 13:49:57

+1

我不喜歡它是寧靜的。這些路線只搜索一些產品集合。 @chrisdinn的答案更加寧靜,但我認爲搜索路線不需要安寧。 Restful主要用於獲取物體的集合和操縱其中一個物體。但無論如何,我很高興我的回答很有幫助! – klew 2010-02-15 14:25:13

4

到這樣做會涉及嵌套類別的資源下的產品資源,像這樣一個RESTful方式:

http://www.myapp.com/categories/toy/products?color=red

你的routes.rb將需要包含以下內容:

map.resources :categories do |category| 
    category.resources :products 
    end 

由於我上面的URL使用Category的type屬性進行路由,我暗示每種類型都是唯一的,像一個ID。這意味着,無論何時在類別控制器(或其他任何地方)加載類別,都需要使用Category.find_by_type(params[:id])而不是Category.find(params[:id])加載類別。我喜歡這種方式儘可能路由類別。

你ProductsController的控制器index動作會發現用線產品,如:

@category = Category.find_by_type(params[:category_id]) 
    @products = @category.products.find(:all, :conditions => { :color => params[:color]}) 

記住,你的分類模型必須包含這一行:

has_many :products 

它可能是一個好主意來執行,在驗證模型:

validates_presence_of :type 
validates_uniqueness_of :type 

爲了使路由工作,你也應該覆蓋在分類模型to_param方法,而不是返回ID類型:

def to_param 
    self.type 
end 
+2

這不是我正在尋找的......但我仍然給你一個投票,因爲你的帖子是有用的和內容豐富的。 – 2010-02-15 13:49:08