这个街区的解释是什么?

时间:2011-10-04 15:53:11

标签: ruby-on-rails ruby scaffolding

我使用脚手架创建了一些模块,但我无法理解如何在不与对象或任何东西相关的情况下使用respond_to?

respond_to do |format|
      format.html { redirect_to posts_url }
      format.json { head :ok }
end

我研究了'do'并发现它就像'每个'处理可枚举的对象

2 个答案:

答案 0 :(得分:1)

我认为这个概念叫做上下文探测。 这意味着该函数实际上并未在其编写的上下文中执行。

因此,您的函数实际上是在response_to(以及其他方法)可用的上下文中执行的。

This book will explain everything, it's pretty amazing reading if you like ruby.

答案 1 :(得分:1)

doend之间的部分是 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方法(htmljson等)。

然后,控制器使用此Collector对象来确定对请求的适当响应(呈现html.erb模板,或将内容格式化为json等等 - 请注意,redirect_to确实是控制器实例方法)。 response_to can be found here的良好文档。 希望这有帮助!