这是利用Rails辅助方法的Ruby代码块。如果您还不熟悉块,那么您将在Ruby中看到很多。
respond_to
是附加到Controller类(或更确切地说,其父类)的Rails帮助器方法。它引用了将发送到View(将发送到浏览器)的响应。
您的示例中的块正在格式化数据-通过在块中传递“格式”参数-每当浏览器请求html或json数据时都将从控制器发送到视图。
如果您在本地计算机上,并且已设置Post脚手架,则可以转到http://localhost:3000/posts
,您将看到所有html格式的帖子。但是,如果您输入this http://localhost:3000/posts.json
:,那么您将在服务器发送的json对象中看到所有帖子。
这对于制作需要从服务器来回传递json的JavaScript繁重的应用程序非常方便。如果您愿意,可以在rails后端轻松创建一个json api,并且只传递一个视图-例如Post控制器的索引视图。然后,您可以使用Jquery或Backbone(或两者)之类的JavaScript库来处理数据并创建自己的界面。这些称为异步UI,它们正变得非常流行(Gmail是其中之一)。它们非常快速,可以为最终用户提供更像台式机的网络体验。当然,这只是格式化数据的优点之一。
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
类的顶部,可以声明希望控制器发送到视图的所有格式。
然后,在控制器方法中,您所要做的就是response_with(@whatever_object_you_have)
它只是比Rails自动生成的代码简化了一点。
如果您想了解其内部工作原理 ...
据我了解,Rails会对这些对象进行内省,以确定实际的格式。“格式”变量值基于此自省。Rails只需一点点信息就可以完成很多工作。您会惊讶于一个简单的@post或:post将走多远。
例如,如果我有一个_user.html.erb局部文件,如下所示:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
然后,仅在我的索引视图中,这将使Rails知道需要部分查找“用户”并遍历所有“用户”对象:
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
会让Rails知道需要找到“用户”部分并遍历所有“用户”对象:
您可能会发现此博客文章很有用: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