以RESTful方式对集合进行排序建模

时间:2011-05-01 13:41:41

标签: ruby-on-rails ruby rest

我有一个使用mongoid的简单rails应用程序。我有一个父文档通过embeds_many / embedded_in嵌入一些子文档。用户应该能够修改嵌入文档的顺序(向上移动,向下移动,移动顶部,......)。我想知道如何使用现有的Rails功能以RESTful方式设计它。我当然能够创建一个控制器动作来获取孩子的id并移动它。但我认为这不是REST的想法。从REST的角度来看,它应该是包含元素的容器的更新。但我不知道如何实现/设计!?任何提示或起点?

2 个答案:

答案 0 :(得分:0)

您通常希望使用PUT更新现有资源。在这种情况下,您正在更新集合成员的序号,因此您只需进行更新。问题是你必须更新集合中每个成员的序数以避免冲突并确保顺序是明确的。所以你想完全更新这个系列......

# routes.rb
resources :items do
  put '/sort' => 'items#sort', :on => :collection
end

# items_controller.rb
def sort
  # update your ordinals however you need
end

可以更新每个成员以执行“移至顶部”等操作,但在大多数情况下,接口通常会更容易为每个更新请求指定所有元素的顺序。换句话说,前端/ api用户按照它们应该作为PUT /items/sort的参数的顺序指定所有元素ID。

答案 1 :(得分:0)

通常你的要求没有完全映射到预定义的REST动词,但只要你注意到REST的精神就可以了。

例如,调整现有项目位置的操作是带有自定义动词的PUT请求。您可以定义单个动词position或多个动词,例如updown,具体取决于您喜欢的方式。在这种情况下,position可以是topbottomupdown中的任何一个,如果您想要实现这些内容。

添加自定义路线非常简单:

resources :items, :member => { :position => :put }

这将创建一个新动词{​​{1}}并相应地将其路由到position