Rails的POST、PUT和GET请求

58

在我生成脚手架之后,Rails让我能够向items.xml发送POST请求来创建新的item。发送GET请求到items.xml将仅列出它们。Rails在哪里指定了基于我执行的操作类型,将调用控制器中的哪个方法(分别是createindex)?

更具体地说,POST调用methodA,但对同一URL的GET调用将调用methodB。这是在哪里指定的?Rails在哪里确定将调用控制器的index方法?

8个回答

95

我相信这是由REST指定的。以下是一个列表:

GET    /items        #=> index
GET    /items/1      #=> show
GET    /items/new    #=> new
GET    /items/1/edit #=> edit
PUT    /items/1      #=> update
POST   /items        #=> create
DELETE /items/1      #=> destroy

编辑添加:如果要获取所有这些路由,只需在config/routes.rb中添加map.resources :items


40
输入"rake routes"以查看相关信息。 - Tom Lehman
还有没有一种明确指定我只想使用POST的方法,就像在ASP.NET MVC中一样([HttpPost]属性)? - Alex
如果您对 /items 执行 GET 操作,将会进入 Index 动作。如果您对 /items 执行 POST 操作,将会进入 Create 动作。 - Matt Grande
1
@Alex:你可以在路由末尾添加 :via => :POST 来指定只使用 POST 方法。同样,如果你只想使用 POST 和 GET 方法(而不是 PUT、DELETE 等),你可以使用 :via => [:POST, :GET]。 - mdpatrick
3
这不是“由REST指定的”,而只是Rails中的一种约定。REST规范与框架如何处理请求以及调用哪个方法无关。 - Asfand Qazi
我认为这至少是REST的一部分。请参阅我提供的维基百科文章链接:https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services - Matt Grande

27
Rails按照惯例为RESTful资源定义了七个控制器方法,它们是:
动作 HTTP方法 目的 ------------------------------------------------- ----------------------- index GET 显示一组资源 show GET 显示单个资源 new GET 显示创建新资源的表单 create POST 创建新资源(new 提交到此处) edit GET 显示编辑现有资源的表单 update PUT 更新现有资源(edit 提交到此处) destroy DELETE 销毁单个资源
请注意,由于Web浏览器通常只支持GET和POST,因此Rails使用隐藏字段将这些转换为PUT和DELETE请求。
在config/routes.rb中指定map.resources :items可以让您免费获得这七种方法。你可以随时通过在控制台输入rake routes来列出应用程序中的所有路由。
更多详细信息,请参见Rails Routing from the Outside In

另外,您还可以查看源代码以“重现”这些行为:Rails v3.2.9 资源 于 actionpack/lib/action_dispatch/routing/mapper.rb。 - brutuscat

10

我已经尽力替换了损坏的链接。请检查并确保我链接到正确的页面。谢谢。 - Bill the Lizard

6

你想知道如何只使用POST请求吗?可以按照以下步骤操作:

resources :items, :only => [:create]

顺便说一下,这是针对Rails 3的,将生成一个单个资源以进行“POST创建”。或者如果您仅需要REST集的一个非常小的子集,只需:

match 'items/:id' => "items#create', :via => :post

etc etc.


5

就像Don Werve所说的那样,看一下你的routes.rb文件。在里面,你可能会有这样的内容:

map.resources :items

这是Rails将POST和GET请求链接到特定操作的地方。要了解其工作原理,请查看其他答案中的链接。文档可以帮助很多。

要查看所有路由以及它们链接到的操作,您可以在进入Rails目录根目录时,在命令提示符中键入rake routes。这将显示一个脚手架提供的所有内容(在路由方面)。


5

这会有很大帮助,但并不是对你问题的直接回答。下面的命令将列出应用程序使用的映射,因此您不必记住所有详细信息或猜测。

$ rake routes

更直接地回答,这是Rails使用的一种约定。当您在routes.rb中设置以下内容时,您就可以建立这种映射关系。

map.resources :items

3

map.resources是一种方法,可以自动为您提供REST路由和路径助手。如果您已经知道并理解了Rails的restful路由工作原理,这是一个不错的功能,但对于学习Rails来说也有一定的障碍,因为太多内容被隐藏了。

Railsguides有一个很好的路由指南


1
说实话,在Rails网站上的路由文档中,你真的不会走错方向。这有助于迈出下一步并超越资源的舒适区域(对于大多数应用程序来说是可以的),并真正掌握可用的稳定路由功能。

http://guides.rubyonrails.org/routing.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接