Rails - 格式和渲染 - 它们是如何工作的?

Posted

技术标签:

【中文标题】Rails - 格式和渲染 - 它们是如何工作的?【英文标题】:Rails - Formats and Rendering - How do they work? 【发布时间】:2016-08-14 14:28:05 【问题描述】:

据我了解,调用render 将向浏览器返回响应。它可以返回不同类型的内容(html、json、js 等)。但是,我对浏览器之后的操作有点困惑。

如果响应是 html,浏览器只会渲染页面。如果响应是 json,通常,客户端 js 代码会获取 json 响应并用它做一些有用的事情。如果响应是js,浏览器会做什么?我不确定这个js是否附加到文档中并执行?这和 Rails UJS 有关吗?

另外,render 与 respond_to 有什么关系?它们是并排使用的,还是一个优先于另一个?

render html:
render js:
render json:

respond_to |format| do
  format.html
  format.js
  format.json
end

很抱歉,这可能看起来像很多问题,但我认为将这些问题放在一起讨论会有所帮助。

【问题讨论】:

【参考方案1】:

如果响应是js,浏览器会怎么做?

这完全取决于浏览器和用户的 javascript 环境。您的应用程序返回 js,浏览器会以它认为最好的方式处理它。

我不确定这个js是否附加到文档并执行?这和 Rails UJS 有关吗?

UJS 更多的是确保应用程序能够正常运行,即使用户的浏览器不处理 javascript。例如,您编写脚本来拦截按钮单击事件并取消单击操作,而不是执行其他操作,例如 AJAX 调用。 如果用户禁用了 javascript,则不会发生此拦截。因为你已经这样写了js,所以会发生正常的按钮点击动作。这两种情况都应该得到处理,并且都应该工作 - 这是对 javascript 的不显眼的使用。

至于附加到文档,不完全没有。浏览器收到一堆代码,如果可以,它会在当前文档的上下文中运行该代码。然后它不会将代码保存在任何地方,当它完成时它被丢弃并且文档保持在脚本离开它的任何状态。

render 与 respond_to 有什么关系?它们是并排使用的,还是一个优先于另一个?

respond_to 允许您根据用户提出请求的方式控制您对用户的响应方式。在上面的 UJS 示例中,这允许您使用一种方法来响应 HTML 和 AJAX 请求,但知道它们的区别并且可以对其响应进行任何需要的更改。

例子:

respond_to |format| do
  format.html # will by default render the view with this actions name
  format.json do # lets pass back the object in json format
    render @object.to_json
  end
end

这些都是介绍性的答案,非常简单,我建议对每个主题进行进一步阅读。

【讨论】:

我实际上指的是 rails/jquery-ujs 以及它带来的魔力。 “至于附加到文档,不完全没有。浏览器收到一堆代码,如果可以的话,它会在当前文档的上下文中运行该代码。它不会将代码保存在任何地方,当它完成它被丢弃,并且文档处于脚本离开它的任何状态。” - 我以后可以使用在 js 响应中定义的函数吗?你知道我可以在哪里阅读更多关于这个主题的信息吗? (浏览器对js响应做了什么)

以上是关于Rails - 格式和渲染 - 它们是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

将 Rails 渲染格式限制为 html 的方法

Rails 中的分析视图

Rails 以不同的格式渲染动作

Rails 3 - 从视图中渲染 PDF 并附加到电子邮件

如何在 Rails 中控制器的一个操作中呈现不同的布局和 json 数据?

Rails Ajax - 渲染不同的部分