使用 Ransack gem 和 EasyAutoComplete 进行全局自动完成搜索(搜索查询不起作用)



我对此很聪明。我正在尝试为全局自动完成搜索栏实现本教程,该搜索栏在数据库中搜索键入的关键字并列出它们。我看过这个问题,这个问题,这个,这个,还有其他几个。没有一个能解决我的问题。

搜索查询只是不返回任何结果,自动完成也不会触发。但是,我仍然可以调用官方指南中所示的函数easyAutocomplete。而且我没有错误(至少在表面上(。

以下是我的代码示例:

routes.rb:

Rails.application.routes.draw do
resources :photo_uploads
#......................
resources :posts do
put 'publish' => 'posts#publish', on: :member
put 'unpublish' => 'posts#unpublish', on: :member
end
get :search, controller: :posts
root to: 'static_pages#home'
get 'static_pages/about'
get 'static_pages/contact'
end

application_controller.rb:

class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :search

#.....................
def search
@q = Post.ransack(title_cont: params[:q])
@searchpost= @q.result(distinct: true) 
# @bodysearch = Post.ransack(body_cont: params[:q]).result(distinct: true) 
respond_to do |format|
format.html {}
format.json {
@searchpost = @searchpost.limit(6) 
# @bodysearch = @bodysearch.limit(6)
}
end 
end
end

ERB 文件:

<%= search_form_for @q do |f| %>
<%= f.search_field :title_cont, class: " search-bar ml-3", data: { behavior: "autocomplete" } %>
<%= f.submit %>
<% end %>

search.json.jbuilder:

json.posts do
json.array!(@posts) do |post|
json.title post.title
json.url post_path(post)
json.published post.published_at
end
end

搜索.js:

document.addEventListener("turbolinks:load", function () {
$input = $("[data-behaviour='autocomplete']")
var options = {
getValue: "title",
url: function (phrase) {
return "/search.json?q=" + phrase;
},
categories: [
{
listlocation: "posts",
header: "<strong>Posts</strong>",
}
],
list: {
onChooseEvent: function () {
var url = $input.getSelectedItemData().url
$input.val("")
Turbolinks.visit(url)
}
}
}
$input.easyAutocomplete(options)
});

posts_controller.rb:

before_action :force_json, only: :search
# .............
private
def force_json
request.format = :json
end 

我使用设计宝石进行身份验证,使用cancancan进行用户角色/访问。它们工作得很好。导轨版本5.1.6

我做错了什么?

这可能有点晚了,但我也在尝试遵循教程,我遇到了类似的问题。对我来说,我使用的是 Rails 6 和 webpacker,我必须确保 easyautocomplete 的 js 和 css 文件在资产管道中,并且它们被正确链接。然后,一旦我让webpacker编译而没有错误,搜索栏就可以工作了。

我为此找到了解决方案。

原因是 Rails 6 显著改变了资源管线,用 WebPacker + Yarn 取代了旧的方式(Sprockets(。因此,本教程中的 JS 部分不再有效。

溶液: 将该教程与本教程相结合: https://joelc.io/dynamic-autocomplete-rails-6

在更多详细信息中,以下是使其正常工作的确切步骤:

  1. 按照GoRails教程进行最后,看到它只能部分工作(JS没有触发,但独立的json页面显示正常(
  2. 保留代码,并按照上面链接的教程进行操作,直到步骤 27。您可以忽略其他步骤,因为GoRails教程在该部分中更好

最新更新