我刚接触Ruby和Rails。有人能告诉我下面这个结构是什么吗?我在方法(def)中看到respond_to结构。所以它是一个嵌套的方法吗?我的意思是,我试图理解这个语言结构。
我确实理解它的功能,即按照给定格式发送响应。
respond_to do |format|
format.html # index.html.erb
format.json { render json: @posts }
end
我刚接触Ruby和Rails。有人能告诉我下面这个结构是什么吗?我在方法(def)中看到respond_to结构。所以它是一个嵌套的方法吗?我的意思是,我试图理解这个语言结构。
我确实理解它的功能,即按照给定格式发送响应。
respond_to do |format|
format.html # index.html.erb
format.json { render json: @posts }
end
这个语言结构是Ruby块。但是如果你真的想了解respond_to
,这篇博客文章提供了一个很好的概述。
关键的事情在于,
respond_to
是附加在控制器的超类ActionController上的方法,并且我们将一个叫做块的东西作为参数传递:...
在
respond_to
方法内部,我们最终得到一个接受一个参数的Proc。该参数在其上调用了.xml和.html方法。当我们从respond_to
内部调用该Proc时,我们将Responder类的实例作为参数传递给它。因此,我们最终会在传递给
respond_to
内部(转换为Proc的)块中调用Responder类的实例上的.html和.xml方法... 呼。
website/book.js
调用它,Rails会返回JSON;如果您使用website/book.html
调用它,则会返回HTML。 - Dty这是闭包。它类似于在其他语言中将函数传递给函数,例如,在Ruby中,您有两个选项来迭代集合:
for elem in collection
# do something
end
或者
collection.each do |elem|
# do something
end
这两者之间有区别,但我不会在这里描述。所以,正如你所看到的那样,它就像将函数传递给方法并在其中运行一样。但是,有两种方法来传递 block,使用 do |variables| ... end
块或 { |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'
这里有一些关于it技术的文章:
请注意,本文档的翻译可能存在一定偏差,仅供参考。for ... in
不会引入新的作用域。 - Hauleth
respond_to
)是一个被传递了块(关键字!)的方法。此外,应该是end
而不是ends
。 - user166390respond_to
方法决定如何调用块(使用yield
)。例如,对于空数组来说,Array.each
将不会执行任何操作。块类似于匿名函数,在JavaScript中通常被广泛使用。然而,它们并不是一等值(在方法内部可以通过使用&block
语法,通过Proc
来提升/推广块)。 - user166390