我正在阅读Rails入门指南,并对第6.7节感到困惑。在生成一个脚手架之后,我在我的控制器中发现了以下自动生成的块:
def index
@posts = Post.all
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @posts }
end
end
我想了解respond_to块实际上是如何工作的。格式是什么类型的变量?是.html和.json方法的格式对象?的文档
ActionController:: MimeResponds::类方法::respond_to
没有回答问题。
据我所知,respond_to是一个附加到ActionController的方法,所以你可以在每个单独的控制器中使用它,因为它们都继承自ActionController。下面是Rails的respond_to方法:
def respond_to(&block)
responder = Responder.new(self)
block.call(responder)
responder.respond
end
你给它传递一个block,就像我在这里展示的:
respond_to <<**BEGINNING OF THE BLOCK**>> do |format|
format.html
format.xml { render :xml => @whatever }
end <<**END OF THE BLOCK**>>
|格式|部分是块期望的参数,所以在respond_to方法中我们可以使用它。如何?
好吧,如果你注意到我们在respond_to方法中传递了一个带前缀的&块,我们这样做是为了将该块作为Proc处理。由于参数有“.xml”,“.html”,我们可以使用它们作为要调用的方法。
我们在respond_to类中所做的基本上是调用Responder类实例的方法“.html, .xml, .json”。
响应器注册背后的元编程(参见Parched Squid的回答)也允许你做这样漂亮的事情:
def index
@posts = Post.all
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @posts }
format.csv { render :csv => @posts }
format.js
end
end
当您访问/posts.csv时,csv行将导致在每个帖子上调用to_csv。这使得从rails站点导出数据为CSV(或任何其他格式)变得很容易。
js行将导致javascript文件/posts.js(或/posts.js.coffee)被呈现/执行。我发现这是一个轻量级的方式来创建一个Ajax支持的网站使用jQuery UI弹出窗口。
据我所知,respond_to是一个附加到ActionController的方法,所以你可以在每个单独的控制器中使用它,因为它们都继承自ActionController。下面是Rails的respond_to方法:
def respond_to(&block)
responder = Responder.new(self)
block.call(responder)
responder.respond
end
你给它传递一个block,就像我在这里展示的:
respond_to <<**BEGINNING OF THE BLOCK**>> do |format|
format.html
format.xml { render :xml => @whatever }
end <<**END OF THE BLOCK**>>
|格式|部分是块期望的参数,所以在respond_to方法中我们可以使用它。如何?
好吧,如果你注意到我们在respond_to方法中传递了一个带前缀的&块,我们这样做是为了将该块作为Proc处理。由于参数有“.xml”,“.html”,我们可以使用它们作为要调用的方法。
我们在respond_to类中所做的基本上是调用Responder类实例的方法“.html, .xml, .json”。