我正在寻找一种将选项传递给服务的安静方式。现在我有一个以标准轨道方式访问的设备资源:
map.resources :devices, :member => [:historical]
因此,我可以使用/devices/:id
获取设备,然后使用/devices/:id/historical
我想在指定范围的历史网址上添加一个参数,因此当我查询历史数据时,我可以按小时,每天,每周,每月返回。像/devices/:id/historical/:range
有没有办法修改上面的路线设置以适应这种情况?或者我只需要像/ devices /:id / historical?range = hourly
那样传递它我更喜欢前者,但我不确定这是否违反了Restful惯例或者最好的方法是什么。
答案 0 :(得分:1)
将范围作为路径段或查询参数都可能是RESTful。
问题实际上是一个设计问题。是否要将历史数据建模为具有参数的单个资源,还是要对多个资源建模?这与我们在进行OO设计时所做的决策相同。你想要一个具有type属性或一堆子类的类吗?或者数据库设计,我们是将数据存储在多个表中还是一个带有鉴别器列的表中?
只要您正确使用HTTP谓词来操作该资源,您就不会违反相关的REST约束。
答案 1 :(得分:1)
我认为您的问题实际上归结为如何知道何时将某些内容表示为资源以及何时使用查询字符串对其进行参数化。
我不知道您的域名,但从您的问题来看,有关设备的历史数据似乎是一种资源,并且通过范围访问该数据的子集最好表示为查询字符串,就像您一样可能会对大量项目进行分页。
要考虑的其他因素是缓存,因为如果您想要单独缓存每个范围,那么您必须使用路径中的路径段,即:range
。这样Rails将在磁盘上生成一个唯一的HTML文件来表示该范围。如果您使用查询字符串,那么它将被有效地忽略,并且将针对不同的范围返回相同的HTML文件。
答案 2 :(得分:0)
在我看来,像是:
match 'devices/:id/historical/:range' => 'devices#historical_filter'
可能会有所帮助,虽然它会要求你在控制器中做比你想象的更多的工作(两者:id和:range成为参数)。它会强制你沿着指定的路线而不是资源丰富的路线路径,但如果你的心脏设置在此而不是查询参数,那么值得一看。