理解Ruby / Rails中的块

时间:2013-01-21 06:47:56

标签: ruby-on-rails ruby

我使用脚手架为帖子创建了一个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 个答案:

答案 0 :(得分:3)

  1. PostsController 继承 ApplicationController 中的方法, ApplicationController 继承自 ActionController :: Base 的方法。这就是responds_to来自的地方。值得研究的主题是“方法查找”。
  2. do ... end是编写块的一种方法。 { render json: @posts }是另一种方式。
  3. json: "foo"是写:json => "foo"
  4. 的更现代的替代方案
  5. format是您正在烹饪以在块内使用的任意变量。 render是一种方法,:json是一种符号。 respond_to将响应Rails格式化响应的用户请求。
  6. 为了理解这个方法,还有:
  7. http://apidock.com/rails/ActionController/MimeResponds/InstanceMethods/respond_to

    如果你想查看source(它有点厚),例如在Paul提到的respond_with方法中,那就在Rails源代码中:

    <强>导轨/ ActionPack的/ LIB / action_controller /金属/ mime_responds.rb

答案 1 :(得分:1)

首先,respond_to不是Rails中的现代东西。但无论如何,我会提供reference解释。

更现代的助手是respond_with

可能这个screencast对您有用。