Rails - map.resources的冗余RESTFUL操作? (新的,创造)

时间:2009-09-13 10:59:46

标签: ruby-on-rails post rest crud action

我想知道为什么当您使用map.resources在rails中创建restful路由时,它会为 new,create,edit,update 生成操作? 为创建更新声明一个操作是否有任何错误 并做这样的事情?

def create
  unless post?
     @user = User.new
  else
     redirect_to :action => 'index' if user.create(params[:user])
  end
end

所以我们可以有像

这样的东西
:GET  users/create # to show the form (same as action - new)
:POST users/create # to create a new user

因为Restful基于动词,这不是最好的使用方法吗?

感谢您的关注

1 个答案:

答案 0 :(得分:4)

我认为这里有两个相关但不同的问题:公开的URL和它们被路由到的控制器方法。由于其中任何一个都可以独立更改,我将单独解决。另外,请注意我将稍微松散地讲一下,并严格讲述在Rails环境中实现的REST。

就外部网址而言,我认为有助于区分构成系统API的网址(:GET users/1:PUT users/1等)以及仅存在的网址使用网络浏览器(users/newusers/5/edit等)方便人类使用。 API只是以某种方式获取资源或与它们交互 - 这些是另一台计算机在与系统交互时将使用的URL。这些URL通常只是您要与之交互的资源的地址,然后您使用HTTP方法和参数来指示您想要做什么(GET =显示此资源,PUT =更改此资源等)。便利URL用于显示表单,以便人们更容易使用API​​。您可以 编辑用户,使用curl手动输入您想要更改的所有参数并向用户/ 1发布POST,但作为人类,如果您只需使用表单就可以轻松实现

要查看上面的示例,:GET users/create可能有意义(并且与默认的:GET users/new非常相似),但:POST users/create大致会转换为“制作”新用户/创建“,这没有多大意义。

就控制器方法而言,“新”和“创建”正在执行根本不同的任务,希望从前面的段落中可以清楚地看出。其中一个是显示表单,另一个是创建新资源。当然,你可以重载相同的方法,但是没有令人信服的理由这样做,创建两个小的独立方法来处理两个小的独立任务可能是一种更自然的方法。