qichunren
·

Hotwire学习记录(1):TURBO_STREAM 类型的请求

在表单提交表单后,在控制台看到有如下的请求日志:

Started POST "/posts" for ::1 at 2022-07-16 22:00:44 +0800
Processing by PostsController#create as TURBO_STREAM

第一个问题:TURBO_STREAM 请求是什么?它是怎么样产生的?怎么样利用它?

通过 Chrome 开发工具检查一下提交表单时的动作。通过观察发现请求头中的Accpet项是这样的:

Accept: text/vnd.turbo-stream.html, text/html, application/xhtml+xml

也就是说浏览器发起的请求头 Accept项中如果包含有 “text/vnd.turbo-stream.html”,那么 Rails 控件器会将此请求作为 TURBO_STREAM 类型的请求来处理。

respond_to do |format|      
  format.turbo_stream      
end

第二个问题:什么时候会发起 TURBO_STREAM 类型的请求?

仔细阅读 Hotwire 的文档,发现其中说明了,在提交表单的 method 属性是 POST, PUT, PATCH, 或者 DELETE 时,Turbo 会在请求头的 Acept 中插入 text/vnd.turbo-stream.html,使得服务器端可以特殊处理。

另外在文档中有说明,当a标签的data-turbo-method属性是非get的其它值时,点击a标签时,背后是通过转换成form元素,从而发起相应类型的表单请求,从而使得a标签也是可以可以发起 TURBO_STREAM 请求的。

注意: 由于表单是不支持嵌套表单的(如div元素中还可以有下一级的div元素),所以不要在表单标签中使用特别的a标签。

bookmark_add
添加收藏
评论
登录后评论

这一块细节我还没有搞懂,我发现如果控制器里

Processing by PostsController#create as TURBO_STREAM

如果视图里 create.turbo_stream.erb 不存在的话,会降级使用对应的 create.html.erb

reply
回复

请求的表头里是有多个格式吗? 如果有多个, controller怎么决定相应哪种格式?

reply
回复
1 回复
arrow_right_alt

赞。感觉社区对 hotwired 的经验还太少了,需要更多的分享。

reply
回复
社区准则 博客 联系 反馈 状态
主题