Rails scaffold生成了以下内容:
respond_to do |format|
if @student.save
format.html { redirect_to @student, notice => 'Student was successfully created.' }
format.json { render :show, status: :created, location: @student }
else
format.html { render :new }
format.json { render json: @student.errors, status: :unprocessable_entity }
end
end在阅读了这之后,我了解了respond_to是如何工作的(某种程度上),但我不明白format在做什么。不是应该是format.html或format.json,而不是两者兼而有之吗?这两条线到底在做什么?
format.html { render :new }
format.json { render json: @student.errors, status: :unprocessable_entity }里面有隐含的if吗?是不是有点像
if (format == html) {}
if (format == json) {}附带注意:为什么update需要respond_to块,而show将在没有任何逻辑的情况下处理/students/1.json或/students/1?
发布于 2015-06-02 16:08:30
format是respond_to 收益率的局部变量。当您执行format.html {}时,您实际上是在为格式注册回调块。
Rails通过注册的格式并试图找到与请求中的MIME类型兼容的格式。如果没有处理程序,它将引发错误。
这可以解释为类似于在case语句(相当于开关语句的Ruby )之上使用语法糖。但是这种类比并不完全准确,因为Rails在匹配请求类型方面做了一些工作。
此外,在注册format.html块时(就像它只是一个条件语句一样)时,不执行块中的代码,而是在respond_to完成时执行,或者如果使用电子标签缓存,则根本不执行。
为什么update需要respond_to块,而show将处理/students/1.json或/students/1,而根本没有任何逻辑?
Rails通过使用约定而不是配置方法和猜测操作的意图来处理许多操作。
def PostsController < ApplicationController
def index
# rails auto-magically fills in the controller with something
# like this
@posts = Post.all
respond_to do |format|
format.html { render :index }
format.json { render json: @posts }
end
end
def show
# convention over configuration is awesome!
@post = Post.find(params[:id])
respond_to do |format|
format.html { render :show }
format.json { render json: @post }
end
end
def new
@post = Post.new
render :new
end
def edit
@post = Post.find(params[:id])
render :edit
end
endRails假设有一个与控制器同名的资源,并且自动神奇地填充控制器操作。它还假设app/views/posts/(:action).html.[erb|haml|slim|jbuilder]中有一个视图。这就是所谓的隐式绘制。
这些评论大致显示了rails试图采取的行动。
它不填充操作数据(创建、更新、销毁)的操作,因为实际实现可能有很大差异,很难做出有用的猜测。
发布于 2015-06-02 15:58:36
这取决于请求的格式。如果请求要求来自服务器的HTML,则将执行format.html块,同样,如果请求要求JSON格式,则将执行format.json。
Rails将自动(读:魔术)为您处理if (format == html)部件。你所要做的就是填空。同样,您可以从format.xml开始编写XML块。
另外,我想你不是这么说的。update方法不需要respond_to块,而show需要。原因很简单:update方法是用来更新模型的,然后,将您重定向到某个地方,而show总是会返回一些东西。在您的示例中,/students/1将返回在数据库中创建的第一个学生,响应将是HTML,而/students/1.json将返回相同的结果,但这次响应将是JSON。
发布于 2015-06-02 17:00:47
好吧,你可以把“格式”替换为“foo”或“香蕉”或任何你想要的东西。在本例中,它只是变量名,因为由respond_to发送到您的块的变量正按照传入的http请求的Accept头请求的格式传递。
有时,您会在日志中看到422个“不可接受的”错误,因为您收到的请求带有一个没有请求应用程序所知道的mime类型的Accept头。
实际上,您的调用者应该使用浏览器或者是JSON使用者发送适当的标题来接收来自样板的响应。
https://stackoverflow.com/questions/30600864
复制相似问题