【问题标题】:How to add live search to Rails 4.2?如何向 Rails 4.2 添加实时搜索?
【发布时间】:2015-11-23 18:20:06
【问题描述】:

我一直在尝试在我的 Rails 4.2 应用程序上创建一个响应 AJAX 的简单搜索表单。我尝试了所有能找到的教程,但仍然无济于事。

这是我的搜索方法:

  def self.search(search)
    search ? where('name LIKE ?', "%#{search}%") : all
  end

我在控制器上的索引操作:

  # GET /ticket_types
  # GET /ticket_types.json
  def index
    @ticket_types = TicketType.search(params[:search]).order(sort_column + " " + sort_direction).paginate(per_page: 10, page: params[:page])
    respond_to do |format|
      format.html {render 'index'}
      format.json {render json: @ticket_types.map(&:name)}
    end
  end

我的过滤器:

  <form>
    <fieldset>
      <legend>Filter</legend>
        <%= form_tag path, remote: true, method: 'get', id: id do %>
          <%= hidden_field_tag :direction, params[:direction] %>
          <%= hidden_field_tag :sort, params[:sort]%>
          <p>
            <%= text_field_tag :search, params[:search], id: 'filter_search_autocomplete', data: {autocomplete_source: ticket_types_path} %>
            <%= render 'button_submit', name: nil, id:"search_button" %>
          </p>
        <% end %>
      </fieldset>
    </form>

提交按钮:

  <%= submit_tag "Search", name: name, class: 'button', id: id, remote: true %>

我的ticket_types.coffee

jQuery ->
  $('#filter_search_autocomplete').autocomplete
  source: $('#filter_search_autocomplete').data('autocomplete-source')

还有我的部分索引:

<p id="notice"><%= notice %></p>

<%= render 'registry_filter', path: ticket_types_path, id: "ticket_search_filter" %>
<%= render 'ticket_types' %>
<br>
<section id="content-area"></section>
<div>
  <%= render 'button_link', button_name: "Create", path: new_ticket_type_path, id: 'create' %>
  <%= render 'button_link', button_name: "Back", path: ticket_types_path, id: 'back_button' %>
</div>

关于如何拥有像 Facebook 这样的实时搜索框有什么想法吗?例如,我希望每次用户在框上键入一个字母时,它会显示大约 5 个包含给定单词的注册表结果,然后将此搜索资产用作部分,以便能够在其他模型上使用应用程序。提前致谢!

【问题讨论】:

  • 首先,我建议您使用某种后端,例如 ElasticSearch,如果您了解 ElasticSearch,请告诉我,我会为您写一个答案。

标签: javascript ruby-on-rails ajax ruby-on-rails-4 livesearch


【解决方案1】:

我做了一些与你想要完成的事情非常相似的事情。

如果您将所有内容都存储在数据库中,那么我要做的一件事就是在您的 rails 控制器中将数据转换为 json。

将数据转换为 json 后,只需在 Rails 表单中创建输入字段,其中将具有自动完成功能。

在下方,您应该将 json 对象路径传递给您的数据选项。

示例: &lt;%= f.text_field :some_name, data: {autocomplete_source: some_name_path} %&gt;

在您的控制器中,您应该这样做。 Order 和 Where 可以在您的模型(首选方式)中声明为范围。

  def index
    @some_name = SomeName.order(:field_name).where("feild_name like ?", "%#{params[:term]}%")

    respond_to do |f|
      f.json { render json: @some_names.map(&:field_name) }
    end
  end

上面实现后我使用的工具是:autocomplete

希望以上内容有所帮助。如果不是这个railscast 插曲应该让你朝着正确的方向前进。

【讨论】:

  • 谢谢@coletrain!建议使用以前的 railscast 来获得自动完成功能:link,当它全部加载到页面上时,我设法让它按预期工作,但在从数据库,它显示了数据库上的所有注册表,而不仅仅是那些与输入的特定字符匹配的注册表,我将更新问题以反映所做的更改。
  • @FilipeGorgesReuwsaat 我已经用如何提取 json 数据的示例更新了我的答案。
  • 再次感谢@coletrain,我按照你说的做了,现在一切正常; )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多