respond_to和respond_with如何在rails中工作?

ahn*_*cad 9 ajax ruby-on-rails respond-to

什么时候有

def some_action
  respond_to do |format|
    format.html {}
    format.js {}
    format.json { respond_with @objects}
  end
end
Run Code Online (Sandbox Code Playgroud)

看起来像html行和js行自动提供/调用匹配动作名称的文件.并且html和js提供一个或另一个,而不是两者.它是否正确?

如果你的js中有一个被调用的ajax调用,它会调用json,它会请求数据,这些需要数据来响应,对吗?我是否需要它来响应json和js,或只是一个?

如果你不回复,并省略所有类型,它默认是否响应html和js?

当我在控制器中执行respond_to而不是每个动作中的respond_to块时,是否使用respond_with @objectsapply to any argument(:thml,:js,:xml,:json等)?

替代语法:

class TheController < ApplicationController

  respond_to :html, :js, :json, only: [:some_action, :other_action]

  def some_action
    respond_with @objects
  end
end
Run Code Online (Sandbox Code Playgroud)

备用语法如何工作?

如果您使用备用语法,您是否可以对不同类型的请求做出不同的响应?如果要以不同的方式响应,是否必须执行respond_to阻止而不是替代语法?这些案例中的每一个如何解决html的优雅降级问题?

Ric*_*eck 9

respond_with

对于给定的控制器动作,respond_with基于客户端请求的mime类型生成适当的响应.

这基本上意味着您的控制器将根据请求发送相应的数据 - 例如,如果您执行了以下操作:

#app/controllers/articles_controller.rb
Class ArticlesController < ApplicationController
   def show
       @article = Article.find params[:id]
       respond_with @article
   end
end
Run Code Online (Sandbox Code Playgroud)

这基本上会响应@article每次发送请求时的数据.如果请求是jsonmime-type,它将作为JSON对象返回; 如果它是HTML请求,它将返回show视图上的HTML对象

-

respond_to

基本上允许您定制对不同mime类型的特定响应.如果发送JS请求,则可以管理JS响应等

respond_to 控制器操作中的块非常麻烦,只是对响应本身的特定更改/编辑才有意义.

一种更简单的方法respond_to是将它声明在控制器文件的顶部,实质上是告诉Rails每个操作都将使用该方法中定义的选项:

#app/controllers/your_controller.rb
Class YourController < ApplicationController
   respond_to :js, :json, :html #-> the same as using respond_to block for each action
end
Run Code Online (Sandbox Code Playgroud)


lak*_*are 7

请注意,在Rails 4中的 respond_with功能已被提取到gem 'responders'(https://github.com/plataformatec/responders).