Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带查询字符串的Rails路由_Ruby On Rails_Routing_Rest_Query String - Fatal编程技术网

Ruby on rails 带查询字符串的Rails路由

Ruby on rails 带查询字符串的Rails路由,ruby-on-rails,routing,rest,query-string,Ruby On Rails,Routing,Rest,Query String,我有一个问题,需要从GET请求传入值,但我不知道如何设置路由定义 我的类别对象有一个类型(字符串)、一个颜色(字符串)和许多产品。我想创建一个简单的web服务,让调用者通过传入类别的类型和颜色来获取类别的所有产品: http://www.myapp.com/getProducts?catType=toy&color=red 还是 如何为这种情况定义正确的路由?有没有更好的方法以一种安静的方式做到这一点。。。因为我知道Rails是Restful的,所以如果有一种“正确”的方法,那就更好了

我有一个问题,需要从GET请求传入值,但我不知道如何设置路由定义

我的类别对象有一个类型(字符串)、一个颜色(字符串)和许多产品。我想创建一个简单的web服务,让调用者通过传入类别的类型和颜色来获取类别的所有产品:

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

如何为这种情况定义正确的路由?有没有更好的方法以一种安静的方式做到这一点。。。因为我知道Rails是Restful的,所以如果有一种“正确”的方法,那就更好了


谢谢

实现这一点的一种RESTful方法将涉及嵌套在类别资源下面的产品资源,如下所示:

您的routes.rb需要包含:

  map.resources :categories do |category|
    category.resources :products
  end
由于我的url在上面使用了类别的type属性进行路由,我的意思是每种类型都是唯一的,就像id一样。这意味着无论何时在Categories controller(或任何其他地方)中加载类别,您都需要使用
类别来加载类别。按类型查找(params[:id])
而不是
类别查找(params[:id])
。只要有可能,我喜欢这种方式

ProductsController控制器索引操作将使用以下行查找产品:

  @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
您的第一个示例:

map.getproduct '/getProduct', :controller => 'your_controller', :action => 'your_action'
在控制器中,参数散列中将包含catType和color:

params[:catType]
=> 'toy'
params[:color]
=> 'red'
有更好的办法吗?可能是的,但这取决于你的需要。如果始终具有CATYPE和color参数,则可以按如下方式添加管线:

map.getproduct '/getProduct/:catType/:color', :controller => 'your_controller', :action => 'your_action'
www.myapp.com/getProduct/toy/red
您将可以像前面的示例一样使用params散列访问这些参数。您的URL将如下所示:

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/…
的所有请求。但在控制器中您将有更多的工作。您可以通过以下操作访问
查询

 params[:query]
对于
www.myapp.com/getProduct/color/red/catType/toy
,它将给出:

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

所以你必须手动解析它。

这并不是我想要的。。。但我还是投了你一票,因为你的帖子很有帮助,内容丰富。太好了。。。Restful方法正是我想要的!检查并检查投票结果。我不认为这是平静的。这些路线只搜索一些产品集合@chrisdinn的答案更为宁静,但我认为搜索路线不需要宁静。Restful主要用于获取对象的集合和对其中一个对象的操作。但无论如何,我很高兴我的回答是有益的!