3

我是 ruby​​ 和 rails 的新手。有人可以指出以下构造是什么。我在方法 (def) 中看到了 respond_to 构造。那么它是方法中的方法吗?我的意思是我试图理解这里的语言结构。

我确实了解它的功能,即以给定格式发送响应。

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

3 回答 3

3

语言结构是一个红宝石块。但是,如果您真的想了解respond_to这里的博客文章,它提供了一个很好的概述

respond_to 是如何工作的?

要理解的关键是,respond_to 是附加到控制器超类的方法:ActionController,我们将作为参数传入称为块的东西:

...

在 respond_to 方法中,我们最终得到一个带有一个参数的 Proc。该参数调用了 .xml 和 .html 方法。当我们从 respond_to 内部调用 Proc 时,我们将什么作为参数传递给它?我们传入一个 Responder 类的实例。

因此,我们最终在响应程序类的实例上调用 .html 和 .xml,因为它被传递到 respond_to 方法内的块(已转换为 Proc)……唷。

于 2012-07-26T06:47:49.807 回答
2

是关闭。这就像在其他语言中传递一个函数,即在 Ruby 中,您有两个选项来迭代集合:

for elem in collection
  # do something
end

或者

collection.each do |elem|
  # do something
end

这两者之间是有区别的,但我不在这里描述它。如您所见,这就像将一个函数传递给该方法并在其中运行它。但是也有两种传递block的方法,使用do |variables| ... endblock或者{ |variables| ... }block。如果您想编写自己的接受块的方法,那么有不止一种方法可以做到(它们有点不同,但会以相同的方式运行):

def run_3_times
  yield
  yield
  yield
end

或者

def run_3_times(&block)
  block.call
  block.call
  block.call
end

它们都被称为相同的方式:

run_3_times { puts 'hello' }
# will yield
hello
hello
hello

但是当块没有通过时会导致另一个错误:

# when using yield
LocalJumpError: no block given (yield)

# when using Proc.call
NoMethodError: undefined method `call' for nil:NilClass
from (pry):8:in `run_3_times'

这里有一些关于它的文章:

于 2012-07-26T06:43:54.443 回答
-1

在 Ruby .respond_to 上? 是一种测试方法。其中一件事是接受一个符号,如果对象可以接收方法则返回true ,否则返回false
例如:
[1, 2, 3].respond_to?(:push) 将返回true,因为您可以在数组对象上调用.push 。但是
[1, 2, 3].respond_to?(:to_sym) 会返回false,因为您不能将数组转换为符号

链接:
a] Ruby 面向的是方法调用的答案,而不是对象的类型。 回应?

于 2013-12-30T01:08:20.600 回答