0

这是生成的默认 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函数采用默认的“块”(一个匿名函数块,它采用一个参数“格式”
  • 根据请求的格式,返回相应的输出

我不明白的是:

  • 这实际上是如何工作的?第 8 行调用对象的函数html方法format,无论传递何种格式。该html方法有什么作用?为什么每次都调用这两种方法?他们是吗?
  • 为什么json方法需要参数(调用渲染的块)但html方法不需要任何参数
  • 这个函数有返回任何东西吗?看起来它返回了json方法的返回值。

我是 ruby​​ 和 rails 的新手,我开始使用示例,想详细了解每条线的作用。

4

2 回答 2

2

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

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

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

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

于 2015-10-19T06:19:55.497 回答
0

评论中的答案(Rails:respond_to 块如何工作?)是基本解释所需要的。

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


哑剧

底线是respond_to处理您发送到应用程序的MIME(多用途 Internet 邮件扩展)类型的块。

这是您希望从特定资源加载的媒体类型的表示,因此,作为开发人员您应该寻求返回的内容。

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

这就是说,“如果客户想要HTML响应此操作,只需像以前一样响应,但如果客户想要 XML,则以 XML 格式返回人员列表。” HTTP Accept(Rails 根据客户端提交的标头确定所需的响应格式。)

尽管 mime 用于任何类型的“媒体”,Rails 的范围主要扩展到请求的类型 - IE JS/JSON等,最常见于AJAX 请求的content/type标头中。


用例

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

大多数请求将是标准 HTML,但有时JS需要JSON返回请求。这些用例可能是 API 或异步请求之类的:

在此处输入图像描述

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

该类Rack:Request在控制器中处理此问题:

request.xhr?

--

关于这在技术上是如何工作的,你最好看看这个问题的答案。我知道如果我向JSONRails 发送请求,我也可以格式化回复JSON

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

于 2015-10-19T08:12:13.793 回答