gpt4 book ai didi

ruby-on-rails - rails : How does the respond_to block work?

转载 作者:行者123 更新时间:2023-12-03 04:09:51 25 4
gpt4 key购买 nike

我正在浏览Getting Started with Rails指南,并对第 6.7 节感到困惑。生成脚手架后,我在 Controller 中找到以下自动生成的 block :

def index
@posts = Post.all

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

我想了解 respond_to block 的实际工作原理。 format 是什么类型的变量? .html 和 .json 是 format 对象的方法吗? documentation对于

ActionController::MimeResponds::ClassMethods::respond_to

没有回答问题。

最佳答案

我是 Ruby 新手,并且被同样的代码困住了。我所关注的部分比我在这里找到的一些答案更为基本。这可能对某人有帮助,也可能没有帮助。

  • respond_to 是父类(super class) ActionController 上的方法。
  • 它需要一个 block ,就像一个委托(delegate)。该 block 从 doend,以 |format| 作为该 block 的参数。
  • respond_to 执行您的 block ,将响应程序传递到 format 参数中。

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

  • Responder 不包含 .html.json 的方法,但我们无论如何都会调用这些方法!这部分让我感到困惑。
  • Ruby 有一个名为 method_missing 的功能。如果您调用不存在的方法(例如 jsonhtml),Ruby 会调用 method_missing 方法。

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

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

附:请注意,在 RoR 4.2 中,respond_to 被提取到 responders 中。 gem 。

关于ruby-on-rails - rails : How does the respond_to block work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com