`respond_to` 在 rails 中的功能如何运作?

How does `respond_to` function in rails work?

这是默认生成的 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

我的理解:

不明白的地方:

我是 ruby 和 rails 的新手,我刚开始使用示例,想详细了解每一行的作用。

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

Rails 然后根据给定的偏好顺序和请求的 headers 选择响应类型。做出该选择后,将调用与所选格式对应的块。在此之前,传递给格式方法的块还没有被调用 - 只是保存以防需要响应类型。

如果响应类型没有块,这意味着应该执行该响应类型的默认操作。在 'html' 的情况下,这意味着 "find an html template and render it",类似于在操作结束时发生的隐式渲染。

ruby 中的所有方法都有一个 return 值,但此方法的 return 值未记录为任何特定值 - 不要依赖它。

评论中的答案 (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 类型的表示,因此,您应该寻找 return 作为开发者。

Rails' respond_to 格式化程序允许您这样做:

What that says is, “if the client wants HTML in response to this action, just respond as we would have before, but if the client wants XML, return them the list of people in XML format.” (Rails determines the desired response format from the HTTP Accept header submitted by the client.)

尽管 mimes 用于任何类型的 "media",但 Rails' 的范围主要扩展到请求的类型 - IE JS/JSON 等,最常见在 AJAX 个请求中的 content/type header 中提到。


用例

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

大多数请求都是标准的 HTML,但有时 JSJSON 请求需要 returned。这些的用例可能是 API 或 asynchronous request:

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

Rack:Request class 在控制器中处理这个:

request.xhr?

--

关于 这在技术上如何工作,您最好查看 answers in this question。我知道如果我向 Rails 发送 JSON 请求,我也可以在 JSON 中格式化回复。

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