2010-02-13 88 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