我正在阅读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
不回答问题。
我是 Ruby 新手,被困在相同的代码上。我挂断的部分比我在这里找到的一些答案更基本。这可能会或可能不会帮助某人。
respond_to
ActionController
do
end
|format|
format
http://api.rubyonrails.org/v4.1/classes/ActionController/Responder.html
Responder
.html
.json
method_missing
json
html
http://ruby- metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.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 所追求的。
responder
ps 请注意,在 RoR 4.2respond_to中被提取到响应者宝石中。