Rails turbo_stream被转移到 HTML

Rails turbo_stream being diverted to HTML

提问人:Jerome 提问时间:9/15/2023 最后编辑:Jerome 更新时间:9/18/2023 访问量:92

问:

以下 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.erbActionController::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 所示),raw=true但是该响应不会替换dom_id(因此使用标志 raw=false 返回 null raw=false) 浏览器希望去别的地方。renderbrowser console complaint about destination

这与没有浏览器控制台投诉的标准行为不同:no browser console complaints

update2
这是一个搜索查询,而不是对数据库创建任何更改的请求。因此,它类似于 get 请求,应该相应地构造。
由于 turbo 流最初不是用于 GET 请求的,因此应通过 turbo 帧来解决此问题。这是框架预期的可执行文件。

把问题留在这里,如果有人遇到类似的困难

Ruby-on-Rails 涡轮增压

评论

0赞 max 9/15/2023
如果希望服务器使用流响应表单提交,则需要将响应中的内容类型标头设置为 。turbo.hotwired.dev/handbook/....您可以使用 MimeResponds - 来执行此操作。text/vnd.turbo-stream.htmlformat.turbo_stream
0赞 max 9/15/2023
但是,在问题中并不清楚您的问题。“强制一个完整的 HTML 对象”是没有意义的。您是在谈论替换流中的内容还是强制重新加载整个页面?
0赞 Jerome 9/15/2023
我的目标是内容替换。最令人不安的是,发送“as TURBO_STREAM”的通常模式应该是自然地调用文件并从那里替换/附加/预置一些dom_id。.turbo_stream.erb
0赞 max 9/15/2023
然后你想使用 .我不是 100% 确定这一点,但我认为正在发生的事情是隐式渲染正在启动,即使请求格式TURBO_STREAM,Rails 也会查找模板并发送响应代码。format.turbo_stream.html.erbtext/html
0赞 max 9/15/2023
请记住,turbo 是围绕典型的 Rails CRUD 控制器构建的,其中表单提交要么在成功时重定向,要么在失败时显式呈现。

答: 暂无答案