【问题标题】:Using Select2 Ajax call with Ruby on Rails and ElasticSearch在 Ruby on Rails 和 ElasticSearch 中使用 Select2 Ajax 调用
【发布时间】:2020-02-08 15:51:06
【问题描述】:

我正在尝试实现 select2 搜索,以根据用户输入的数据动态生成结果。

当用户输入时,它应该发送一个 GET 请求到一个针对 ElasticSearch 运行查询的操作,然后 ElasticSearch 应该返回一些我可以转换成 JSON 的对象。

我没有看到 select2 搜索字段下方显示任何结果,尽管查询是针对 ElasticSearch 执行的,并且它正在根据用户数据返回结果。

仪表板控制器.rb

def card_search
    if params[:query].present?
      cards = Elasticsearch::Model.search(params[:query]).records.first(1)
      hash = {}
      hash["results"] = cards.map{|v| v.serializable_hash(only: [:name]) }
      render json: hash.to_json
    else
      render json: []
    end
end

dashboard.html.erb

$(".js-data-example-ajax").select2({
  ajax: {
    url: "/dashboard/card_search",
    dataType: 'json',
    type: "GET",
    delay: 250,
    data: function (term, page) {
      return {
        query: term,
        page: page
      };
    },
    formatResult: function (item) { return item.name; },
    formatSelection: function (item) { return item.name; },
    results: function (data, page) {
      return data;
    },
    cache: true
  },
  placeholder: 'Search for a card',
  minimumInputLength: 1,
});

参数从javascript成功传入控制器:

参数:{"query"=>"Charizard", "page"=>"1"}

ElasticSearch 生成结果数组并转换为 JSON:

"{\"结果\":[{\"name\":\"Charizard\"}]}"

当ElasticSearch返回一个数组,将JSON返回给AJAX调用时,会产生这个错误:

【问题讨论】:

    标签: javascript ruby-on-rails ruby ajax jquery-select2


    【解决方案1】:

    解决了!

    我意识到我的 JSON 格式错误,尽管我遵循了官方的 select2 文档:https://select2.org/data-sources/formats

    所以不要将我的数据存储在哈希中,然后将其转换为 json。

    我遍历了 ElasticSearch 的结果并将每个结果存储在一个数组中。然后我将此数组转换为 json,然后将其返回给 AJAX 调用。

    def card_search
        if params[:query].present?
          cards = Elasticsearch::Model.search(params[:query]).records.first(1)
          array = []
    
          cards.each do |c|
            array << c
          end
    
          render json: array.to_json
        else
          render json: []
        end
    end
    

    我还必须更改在 select2 初始化程序上格式化结果的方式。 我需要遍历每个数据项,并指定每个结果的 id 和文本,以便 select2 可以显示它。

    results: function (data) {
      var results = [];
      $.each(data, function(index, item){
        results.push({
          id: item.id,
          text: item.name
        });
      });
      return {
          results: results
      };
    },
    

    【讨论】:

    • 重要的是要知道你运行的是哪个版本的select2,select2 v4和v3的选项和参数是不同的。我使用的是 v3,但遵循 v4 文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多