提问人:Jerome 提问时间:9/15/2023 最后编辑:Jerome 更新时间:9/18/2023 访问量:92
Rails turbo_stream被转移到 HTML
Rails turbo_stream being diverted to HTML
问:
以下 Rails 7 表单及其 HTML 渲染,运行:turbo-rails 1.4
<%= form_with url: search_loop_results_individuals_path do |form| %>
<%= form.text_field 'q', style: 'display: inline-block; width: 75%' %>
<%= form.submit t('search') %>
<% end %>
<div id="search_results">
</div>
...
<form action="/individuals/search_loop_results?locale=en" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="blurb" autocomplete="off" />
<input style="display: inline-block; width: 75%" type="text" name="q" id="q" />
<input type="submit" name="commit" value="search" data-disable-with="search" />
</form>
<div id="search_results">
</div>
正在记录
Started POST "/individuals/search_loop_results?locale=en" for 127.0.0.1 at 2023-09-15 11:55:32 +0200
Processing by IndividualsController#search_loop_results as TURBO_STREAM
控制器操作执行
def search_loop_results
@individuals = Individual.where("name_last ILIKE ?", "%" + params[:q] + "%" ).or(Individual.where("name_first ILIKE ?", "%" + params[:q] + "%" )).page params[:page]
end
日志显示可以进行搜索以填充部分
Rendering individuals/search_loop_results.html.erb within layouts/application
Individual Count (1.1ms) SELECT COUNT(*) FROM "individuals" WHERE (name_last ILIKE '%ludi%' OR name_first ILIKE '%ludi%')
↳ app/views/individuals/_index_for_assignment.html.erb:5
但是,如果使用 调用文件,Rails 将遇到错误。如果命名,则该过程会以意想不到的方式完成。应用处理部分内容并循环访问结果集合search_loop_results.turbo_stream.erb
ActionController::UnknownFormat (IndividualsController#search_loop_results is missing a template for this request format and variant.
search_loop_results.html.erb
Rendering individuals/search_loop_results.html.erb within layouts/application
Individual Count (1.0ms) SELECT COUNT(*) FROM "individuals" WHERE (name_last ILIKE '%ludi%' OR name_first ILIKE '%ludi%')
↳ app/views/individuals/_index_for_assignment.html.erb:5
但随后继续处理请求,就好像它不是 Turbo 流一样并处理文件
Rendered individuals/_index_for_assignment.html.erb (Duration: 27.7ms | Allocations: 9651)
Rendered individuals/search_loop_results.html.erb within layouts/application (Duration: 29.3ms | Allocations: 10025)
在浏览器控制台重复该问题时:
XHR POST http://localhost:3000/individuals/search_loop_results?locale=en
[HTTP/1.1 200 OK 129ms]
Error: Form responses must redirect to another location
为什么 rails 不遵循启动turbo_stream操作并强制执行完整 HTML 对象的标准模式?
更新
在控制器中尝试:
# respond_to do |format|
# format.turbo_stream do
render turbo_stream: turbo_stream.replace('search_results', partial: 'individuals/index_for_assignment', class: 'fade-in-div')
# end
# end
respond_to块是同义的,rails 抱怨被要求响应太频繁。已注释掉
留下执行过程的行完成,遍历(正确的)结果集合并发送正确的响应(如浏览器控制台中使用 raw=true 所示),但是该响应不会替换dom_id(因此使用标志 raw=false 返回 null
)
浏览器希望去别的地方。
render
update2
这是一个搜索查询,而不是对数据库创建任何更改的请求。因此,它类似于 get 请求,应该相应地构造。
由于 turbo 流最初不是用于 GET 请求的,因此应通过 turbo 帧来解决此问题。这是框架预期的可执行文件。
把问题留在这里,如果有人遇到类似的困难
答: 暂无答案
评论
text/vnd.turbo-stream.html
format.turbo_stream
.turbo_stream.erb
format.turbo_stream
.html.erb
text/html