You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ransack gem实现无回车即时搜索(带1秒延迟)

需求说明

现有代码运行正常,需要实现按下按键后自动触发搜索并筛选Model条目,且希望在筛选前设置1秒延迟。当前的html.erb搜索代码片段如下:

<%= search_form_for @query, url: users_path, data: {search_delay_target: "form"}, method: :get, html: { class: "relative" } do |f| %>  
  <div class="relative">
    <%= f.search_field :first_name_or_last_name_or_email_cont, placeholder: "Search...", data: { action: 'keydown->search-delay#search', search_delay_target: "input"},
         class: "block w-full rounded-md border-0 pl-10 py-2 pr-12 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" %>
    <div class="absolute inset-y-0 left-0 flex py-3.5 pl-3">
      <svg class="w-4 h-4 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-5.5-5.5M10 14a7 7 0 1 1 0-14 7 7 0 0 1 0 14z"/>
       </svg>
     </div>
     <div class="absolute inset-y-0 right-0 flex py-1.5 pr-1.5">
       <kbd class="inline-flex items-center rounded border border-gray-200 px-1 font-sans text-xs text-gray-400">⌘K</kbd>
     </div>
  </div>
  <%= f.submit "Search", class: "hidden" %>
<% end %>
实现方案

1. 编写Stimulus延迟搜索控制器

直接在app/javascript/controllers目录下新建search_delay_controller.js文件,代码如下:

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  static targets = ["form", "input"]

  connect() {
    this.timeoutId = null
  }

  search() {
    // 清除上一次的延迟任务,避免重复提交
    if (this.timeoutId) clearTimeout(this.timeoutId)
    
    // 1秒后自动提交表单
    this.timeoutId = setTimeout(() => {
      this.formTarget.submit()
    }, 1000)
  }
}

2. 确认视图目标绑定

你的现有代码已经正确设置了Stimulus的目标和动作绑定:

  • 表单标记了data-search-delay-target="form"
  • 输入框绑定了data-action="keydown->search-delay#search"和data-search-delay-target="input"
    无需额外修改视图代码。

3. 逻辑说明

  • 用户每次按键时,先清除之前未执行的延迟任务,确保只有停止输入1秒后才会触发搜索
  • 延迟时间设为1000毫秒(1秒),可根据需求调整数值
  • 自动提交隐藏的搜索按钮,触发后端的Model筛选逻辑

内容的提问来源于stack exchange,提问作者morris menanya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:07:49