首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails、respond_to块和blocks格式

Rails、respond_to块和blocks格式
EN

Stack Overflow用户
提问于 2015-06-02 15:54:01
回答 3查看 2.7K关注 0票数 0

Rails scaffold生成了以下内容:

代码语言:javascript
复制
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.htmlformat.json,而不是两者兼而有之吗?这两条线到底在做什么?

代码语言:javascript
复制
format.html { render :new }
format.json { render json: @student.errors, status: :unprocessable_entity }

里面有隐含的if吗?是不是有点像

代码语言:javascript
复制
if (format == html) {}
if (format == json) {}

附带注意:为什么update需要respond_to块,而show将在没有任何逻辑的情况下处理/students/1.json/students/1

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-02 16:08:30

formatrespond_to 收益率的局部变量。当您执行format.html {}时,您实际上是在为格式注册回调块。

Rails通过注册的格式并试图找到与请求中的MIME类型兼容的格式。如果没有处理程序,它将引发错误。

这可以解释为类似于在case语句(相当于开关语句的Ruby )之上使用语法糖。但是这种类比并不完全准确,因为Rails在匹配请求类型方面做了一些工作。

此外,在注册format.html块时(就像它只是一个条件语句一样)时,不执行块中的代码,而是在respond_to完成时执行,或者如果使用电子标签缓存,则根本不执行。

为什么update需要respond_to块,而show将处理/students/1.json或/students/1,而根本没有任何逻辑?

Rails通过使用约定而不是配置方法和猜测操作的意图来处理许多操作。

代码语言:javascript
复制
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   
end

Rails假设有一个与控制器同名的资源,并且自动神奇地填充控制器操作。它还假设app/views/posts/(:action).html.[erb|haml|slim|jbuilder]中有一个视图。这就是所谓的隐式绘制

这些评论大致显示了rails试图采取的行动。

它不填充操作数据(创建、更新、销毁)的操作,因为实际实现可能有很大差异,很难做出有用的猜测。

票数 4
EN

Stack Overflow用户

发布于 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。

票数 1
EN

Stack Overflow用户

发布于 2015-06-02 17:00:47

好吧,你可以把“格式”替换为“foo”或“香蕉”或任何你想要的东西。在本例中,它只是变量名,因为由respond_to发送到您的块的变量正按照传入的http请求的Accept头请求的格式传递。

有时,您会在日志中看到422个“不可接受的”错误,因为您收到的请求带有一个没有请求应用程序所知道的mime类型的Accept头。

实际上,您的调用者应该使用浏览器或者是JSON使用者发送适当的标题来接收来自样板的响应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30600864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档