这是一段利用Rails helper方法的Ruby代码。如果你还不熟悉block,你会在Ruby中看到很多。
respond_to是一个附加到Controller类(或者更确切地说,它的超类)的Rails助手方法。它引用将发送到视图(将发送到浏览器)的响应。
示例中的块正在格式化数据——通过在块中传入一个“format”参数——当浏览器请求html或json数据时,这些数据将从控制器发送到视图。
如果你在你的本地机器上,你已经设置了Post脚手架,你可以访问http://localhost:3000/posts,你会看到你所有的文章都是html格式的。但是,如果你输入这个:http://localhost:3000/posts.json,那么你会看到你所有的帖子在一个json对象中从服务器发送。
This is very handy for making javascript heavy applications that need to pass json back and forth from the server. If you wanted, you could easily create a json api on your rails back-end, and only pass one view - like the index view of your Post controller. Then you could use a javascript library like Jquery or Backbone (or both) to manipulate data and create your own interface. These are called asynchronous UIs and they are becomming really popular (Gmail is one). They are very fast and give the end-user a more desktop-like experience on the web. Of course, this is just one advantage of formatting your data.
Rails 3的写法如下:
class PostsController < ApplicationController
# GET /posts
# GET /posts.xml
respond_to :html, :xml, :json
def index
@posts = Post.all
respond_with(@posts)
end
#
# All your other REST methods
#
end
通过将respond_to:html,:xml,:json放在类的顶部,你可以声明所有你想要控制器发送到视图的格式。
然后,在控制器方法中,你所要做的就是respond_with(@whatever_object_you_have)
它只是比Rails自动生成的代码简化了一点。
如果你想知道它的内部工作原理…
据我所知,Rails内省对象以确定实际的格式。“format”变量的值就是基于这种自省。Rails可以用一点点信息做很多事情。你会惊讶于一个简单的@post或:post能走多远。
例如,如果我有一个_user.html。Erb的部分文件是这样的:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
然后,在我的索引视图中,这将让Rails知道它需要找到'users'部分,并遍历所有'users'对象:
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
会让Rails知道它需要找到'user'部分并遍历所有'users'对象:
你可能会发现这篇博客文章很有用:http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
你也可以阅读原文:https://github.com/rails/rails