rails中的“respond_to”函数如何工作?

时间:2015-10-19 06:05:05

标签: ruby-on-rails ruby model-view-controller respond-to

这是生成的默认Rails代码。我理解代码的作用(来自文档中的解释),但不知道它是如何做的。

  1 class PostsController < ApplicationController
  2   # GET /posts
  3   # GET /posts.json
  4   def index
  5     @posts = Post.all
  6 
  7     respond_to do |format|
  8       format.html # index.html.erb
  9       format.json { render json: @posts }
 10     end
 11   end

我的理解:

  • Post.all返回保存在其中的所有帖子的数组 实例变量@posts
  • respond_to函数采用默认值 &#39;块&#39; (一个带有一个参数的匿名功能块 &#39;格式&#39;
  • 根据请求的格式,返回相应的输出

我不明白:

  • 这实际上如何运作?无论传递什么格式,第8行都会调用html对象的函数format方法。 html方法有什么作用?为什么每次调用这两种方法?是吗?
  • 为什么json方法需要一个参数(调用render的块),但html方法不需要任何参数
  • 此功能是否会返回任何内容?看起来它返回json方法的返回值。

我是ruby和rails的新手,我开始使用示例,并希望详细了解每行的内容。

2 个答案:

答案 0 :(得分:2)

format上调用的方法告诉Rails响应类型可用。在上面的例子中,Rails被告知2个可接受的响应类型(按首选顺序)是html和json。

然后Rails根据给定的首选顺序和请求的标题选择响应类型。做出该选择后,将调用与所选格式对应的块。在此之前,尚未调用传递给格式方法的块 - 只需在需要响应类型时保存。

如果响应类型没有阻止,则表示应采用该响应类型的默认操作。在'html'的情况下,这意味着“找到一个html模板并渲染它”,类似于在动作结束时发生的隐式渲染。

ruby​​中的所有方法都有一个返回值,但是这个方法的返回值没有被记录为特别是 - 不要依赖它。

答案 1 :(得分:0)

评论中的答案(Rails: How does the respond_to block work?)是基本级解释所需要的。

源代码(我想?)可以在这里找到: /lib/action_controller/metal/mime_responds.rb

MIME

最后一行是respond_to阻止您发送到应用的MIME (Multipurpose Internet Mail Extensions) types

这是您希望从特定资源加载的 media 类型的表示,因此,您应该将其作为开发人员返回。

Rails'respond_to格式化程序允许您执行此操作:

  

这就是说,“如果客户希望HTML对此作出回应   行动,只是像我们以前一样回应,但如果客户想要的话   XML,以XML格式返回人员列表。“(Rails确定   来自HTTP Accept标题的所需响应格式   客户。)

虽然mimes用于任何类型的“媒体”,但Rails的范围主要扩展到请求类型 - IE JS / JSON等,最常见于{{3} AJAX请求。

使用案例

关于函数如何在 rails 中运行,您需要了解每次向应用程序发送请求时,它都会以某种方式格式化

大多数请求都是标准HTML,但有时需要返回JSJSON个请求。这些用例可以是API或content/type header

asynchronous request

enter image description here个请求通过XMLJSON发送 - 这通常表示控制器操作中的不同方法。虽然并非总是如此,但它通常使您能够根据您调用的请求类型定义特定功能。

Ajax类在控制器中处理此问题:

request.xhr?

-

关于如何这在技术上有效,你最好看Rack:Request。我知道如果我向Rails发送JSON请求,我也可以在JSON中格式化回复。

Rails采用MIME类型并相应地做出响应。