理解 Ruby/Rails 中的块

3

我使用脚手架创建了一个用于文章的CRUD系统。在控制器中,我看到了这个:

class PostsController < ApplicationController
  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end
  end
  • 什么是respond_to,它从哪里来?由于它使用了do运算符,我假设它是某种可迭代列表。对于该列表中的每个format,它将执行htmljson方法。

  • { render json: @posts }json方法有何关系?render json: @posts作为参数传递给方法吗?renderjson是否都是对象?我从未见过在符号之外使用冒号表示法。

2个回答

3
  1. PostsController 继承自 ApplicationController,而 ApplicationController 又继承自 ActionController::Base。这就是为什么有 responds_to 的原因。值得关注的主题是“方法查找”。
  2. do ... end 是编写块的一种方式。{ render json: @posts } 是另一种方式。
  3. json: "foo" 是编写 :json => "foo" 的现代化替代品。
  4. format 是你在块内部使用的任意变量。 render 是一个方法,:json 是一个符号。 respond_to 将响应用户请求,使 Rails 格式化响应。
  5. 还有这个来理解该方法:

http://apidock.com/rails/ActionController/MimeResponds/InstanceMethods/respond_to

如果你想查看源代码(有点复杂),例如Paul提到的respond_with方法,可以在Rails源代码中找到:

rails/actionpack/lib/action_controller/metal/mime_responds.rb


谢谢,这非常有帮助。在 Ruby 中,似乎有很多实现同一件事情的方式,语法上我只是不习惯阅读每种方式。 - telkins

1
首先,respond_to 在 Rails 中并不是现代的东西。但我仍然会提供参考来解释。

更现代的助手是respond_with

可能,这个屏幕录像对你有用。


谢谢分享视频,我会去看的。那么你认为主网站上的博客教程已经过时了吗?我还应该继续学习吗? - telkins
这些指南并不过时。respond_to 仍然有效,我没有听说在这方面有任何弃用的消息。但是使用 respond_with 可以使您的代码更简洁。我可以使用您想要的任何方法。 - Paul Brit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接