9

当有

def some_action
  respond_to do |format|
    format.html {}
    format.js {}
    format.json { respond_with @objects}
  end
end

似乎 html 行和 js 行会自动提供/调用与操作名称匹配的文件。并且 html 和 js 提供一个或另一个,而不是两者。这个对吗?

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

如果不respond_to,并且省略所有类型,是否默认响应html和js?

当我在控制器中执行 respond_to 而不是每个操作中的 respond_to 块时,使用是否respond_with @objects适用于任何参数(: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

替代语法如何工作?

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

4

3 回答 3

10

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

这基本上会响应@article您每次发送请求时的数据。如果请求是jsonmime 类型的,它将作为 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
于 2014-07-15T07:22:57.853 回答
7

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

于 2015-11-09T03:39:06.367 回答
0

何时需要/不需要每一format.*whatever*行的情况。

通常,您不需要任何东西。默认情况下,Rails 会在与控制器名称匹配的视图文件夹下查找与操作名称匹配的 html 文件(也称为模板)。

我不确定 json 和 html 何时/为什么有时会配对在一起(就像在脚手架生成的代码中一样)。也许 json 行用于 turbolinks(请确认/更正)。但我确实知道respond_to,当您希望每种类型的行为不同时(例如,通过 js 一次提供 10 个结果,但通过 html 提供更多结果),您会使用具有各种格式行的块。

remote: true在表单或链接中使用时需要js格式。这是因为 Using this remote: true 禁止提供 html 模板,而是查找与操作名称匹配的 js 文件,并执行/呈现该文件。如果你只在 js 中做事,你实际上不需要响应 json 行。

额外提示:如果您的 js 文件有 js.erb,您可以访问您在操作中设置的实例变量(局部变量怎么样?请确认/更正)。这是有道理的,因为您的*.js.erb文件在技术上是一个视图。视图可以访问其相应操作的变量(嗯,当视图从另一个控制器呈现时呢?)。因此,如果您已经可以访问 js 文件中的操作变量,这可以消除在许多情况下进行 ajax 调用或 json 调用的需要。

我实际上不确定在使用remote: true/ javascript 时何时需要 json 行。需要 json 数据的显式 jQuery.ajax() 方法调用可能需要使用对 json 的响应行。

于 2014-07-16T02:07:50.817 回答