我使用脚手架创建了一些模块,但我无法理解如何在不与对象或任何东西相关的情况下使用respond_to?
respond_to do |format|
format.html { redirect_to posts_url }
format.json { head :ok }
end
我研究了'do'并发现它就像'每个'处理可枚举的对象
答案 0 :(得分:1)
我认为这个概念叫做上下文探测。 这意味着该函数实际上并未在其编写的上下文中执行。
因此,您的函数实际上是在response_to(以及其他方法)可用的上下文中执行的。
This book will explain everything, it's pretty amazing reading if you like ruby.
答案 1 :(得分:1)
do
和end
之间的部分是 ruby块。如果您熟悉匿名函数,它与此概念有一些相似之处。 respond_to
是控制器上的实例方法;该块传递给此方法。 |format|
是此方法在执行某个时刻传递给块的参数。
块的优点在于它们是在方法调用者的上下文(“绑定”)中进行评估的,在本例中是控制器的实例。因此,即使您在另一个对象上调用方法,也可以使用控制器里面块中可以使用的任何变量或方法。这是Ruby的一个非常强大的功能,正如@Niklaos和@Perry所说,你应该学习更多关于ruby习语的知识,因为这些块无处不在!
块的其他语法是
# the number of yielded arguments can vary from zero to many
method {|yielded_argument| do_something_with yielded_argument}
还有一件事:许多迭代器方法在ruby中使用块,但块不限于迭代。例如,'each'是一个迭代器,产生(传递给块)一个接一个地调用它的集合的每个成员。
因此,要回答您的问题,respond_to
方法会产生一个ActionController::MimeResponds::Collector
对象到该块;在此块中,您可以为不同的MIME类型配置不同的响应。为此,您将另一个块传递给此对象的一个或多个MIME方法(html
,json
等)。
然后,控制器使用此Collector对象来确定对请求的适当响应(呈现html.erb模板,或将内容格式化为json等等 - 请注意,redirect_to确实是控制器实例方法)。 response_to can be found here的良好文档。 希望这有帮助!