【问题标题】:How does `respond_to` function in rails work? [duplicate]Rails 中的“respond_to”函数如何工作? [复制]
【发布时间】:2016-01-17 09:31:52
【问题描述】:

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

我不明白的:

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

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

【问题讨论】:

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


【解决方案1】:

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

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


MIME

底线是respond_to 块处理您发送到应用程序的MIME (Multipurpose Internet Mail Extensions) types

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

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

这就是说,“如果客户想要HTML 来回应这个 行动,就像我们以前一样回应,但如果客户想要 XML,将 XML 格式的人员列表返回给他们。” (导轨确定 来自HTTP Accept 标头的所需响应格式 客户。)

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


用例

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

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

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

Rack:Request 类在控制器中处理这个问题:

request.xhr?

--

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 什么时候调用index方法,什么时候调用传递给respond_to的block?每个请求都会调用它们中的每一个还是在启动服务器时调用一次? format.html 方法如何访问 @posts 实例变量?我希望它是 rails 魔法的一部分,而不是默认的 ruby​​。那么,只有可以在传递给respond_to 的块内编写的代码是format 函数的方法调用(或以其他方式告诉rails 不同的可能响应类型)?
    • 每次请求都会发生这种情况。你可以在 respond_to 块中写任何你想写的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2023-01-27
    • 2012-04-13
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多