Ruby on rails 带查询字符串的Rails路由
我有一个问题,需要从GET请求传入值,但我不知道如何设置路由定义 我的类别对象有一个类型(字符串)、一个颜色(字符串)和许多产品。我想创建一个简单的web服务,让调用者通过传入类别的类型和颜色来获取类别的所有产品: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的,所以如果有一种“正确”的方法,那就更好了
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主要用于获取对象的集合和对其中一个对象的操作。但无论如何,我很高兴我的回答是有益的!