小编典典

Rails:respond_to 块是如何工作的?

all

我正在阅读Rails 入门指南,但对第 6.7
节感到困惑。生成脚手架后,我在控制器中找到以下自动生成的块:

def index
  @posts = Post.all

  respond_to do |format|
    format.html  # index.html.erb
    format.json  { render :json => @posts }
  end
end

我想了解 respond_to 块的实际工作原理。什么类型的变量是格式?是格式对象的 .html 和 .json
方法吗?的文档_

ActionController::MimeResponds::ClassMethods::respond_to

不回答问题。


阅读 101

收藏
2022-06-01

共1个答案

小编典典

我是 Ruby 新手,被困在相同的代码上。我挂断的部分比我在这里找到的一些答案更基本。这可能会或可能不会帮助某人。

  • respond_to是超类的一个方法ActionController
  • 它需要一个块,就像一个委托。该块来自dountil end,并|format|作为该块的参数。
  • respond_to 执行你的块,将 Responder 传递给format参数。

http://api.rubyonrails.org/v4.1/classes/ActionController/Responder.html

  • Responder不包含.htmlor的方法.json,但我们还是调用了这些方法!这部分让我陷入了困境。
  • Ruby 有一个名为method_missing. 如果您调用不存在的方法(如jsonor html),Ruby 会method_missing改为调用该方法。

http://ruby-
metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html

  • 该类Responder将其method_missing用作一种注册。当我们调用“json”时,我们告诉它通过序列化为 json 来响应带有 .json 扩展名的请求。我们需要html不带参数调用来告诉它以默认方式(使用约定和视图)处理 .html 请求。

可以这样写(使用类似 JS 的伪代码):

// get an instance to a responder from the base class
var format = get_responder()

// register html to render in the default way
// (by way of the views and conventions)
format.register('html')

// register json as well. the argument to .json is the second
// argument to method_missing ('json' is the first), which contains
// optional ways to configure the response. In this case, serialize as json.
format.register('json', renderOptions)

这部分让我很困惑。我仍然觉得它不直观。Ruby 似乎相当多地使用了这种技术。整个类 ( responder)
成为方法实现。为了利用method_missing,我们需要一个类的实例,因此我们必须传递一个回调,他们将类方法对象传递给该回调。对于使用类 C
语言编码 20 年的人来说,这对我来说是非常落后和不直观的。不是说不好!但这是很多具有这种背景的人需要了解的事情,我认为这可能是 OP 所追求的。

ps 请注意,在 RoR
4.2respond_to中被提取到响应者宝石中。

2022-06-01