ruby-on-rails 使用Hotwire/Turbo Frames的“实时搜索”导致“内容缺失”错误

63lcw9qa  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(140)

我使用以下设置来做一个“现场搜索”与涡轮帧。

# index.html.erb
<%= form_with(url: tools_path, method: :get, data: { turbo_frame: :tools }) do |form| %>
  <%= form.text_field :query, placeholder: "Search tools...", oninput: "this.form.requestSubmit()" %>
<% end %>
<%= turbo_frame_tag :tools do %>
  <ul role="list">
    <%= render partial: "tool", collection: @tools %>
  </ul>
<% end %>
# tools_controller.rb
def index
  if params[:query].present?
    @tools = current_user.tools.search(params[:query]).distinct
  else
    @tools = current_user.tools.order(created_at: :desc)
  end
end
# tool.rb

scope :search, -> (query) do
  return if query.blank?

  joins(:categories).where("tools.name ILIKE :query OR brand ILIKE :query OR notes ILIKE :query OR part_number ILIKE :query OR categories.name ILIKE :query", query: "%#{query}%")
end

当有结果时,它工作得很好,但如果没有任何结果,它会在浏览器中显示“内容缺失”错误。

<turbo-frame id="tools" src="https://localhost:3000/tools?query=pressure+washer" complete="">
  <strong class="turbo-frame-error">Content missing</strong>
</turbo-frame>

我尝试在turbo_frame_tag中添加@tools.empty?检查,但似乎没有效果。
不知道还能做什么来调试这个。
沿着运行Rails 7.1.0.alpha和turbo-rails 1.4.0。

vhipe2zx

vhipe2zx1#

如果Turbo无法在响应中找到发起请求的Turbo帧,则通常会出现“内容丢失”错误。根据您的代码,我认为问题在于没有结果时没有呈现turbo_frame_tag
要解决此问题,您可以尝试以下操作:
data-turbo-if="@tools.any?"属性添加到turbo_frame_tag。这将告诉Turbo只渲染帧,如果有任何结果。在turbo_frame_tag中,添加一个<div class="empty-state">No tools found</div>元素。如果没有结果,则会显示此信息。下面是一个如何执行此操作的示例:

<turbo_frame_tag :tools data-turbo-if="@tools.any?">
  <ul role="list">
    <%= render partial: "tool", collection: @tools %>
  </ul>
</turbo_frame_tag>

<turbo_frame_tag :tools data-turbo-if="@tools.empty?">
  <div class="empty-state">No tools found</div>
</turbo_frame_tag>

相关问题