在 Rails 和 ElasticSearch 上使用 Select2 Ajax 调用 Ruby
Using Select2 Ajax call with Ruby on Rails and ElasticSearch
我正在尝试实施 select2 搜索以根据用户输入的数据动态生成结果。
当用户输入时,它应该向针对 ElasticSearch 运行查询的操作发送 GET 请求,然后 ElasticSearch 应该 return 一些我可以转换成 JSON 的对象。
尽管查询是针对 ElasticSearch 执行的,但我没有看到 select2 搜索字段下方显示任何结果,并且它 returning 结果基于用户数据。
DashboardController.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:
"{\"results\":[{\"name\":\"Charizard\"}]}"
当 ElasticSearch return 是一个数组并且 JSON 被 return 编辑到 AJAX 调用时,会产生此错误:
已解决!
我意识到我的 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 搜索以根据用户输入的数据动态生成结果。
当用户输入时,它应该向针对 ElasticSearch 运行查询的操作发送 GET 请求,然后 ElasticSearch 应该 return 一些我可以转换成 JSON 的对象。
尽管查询是针对 ElasticSearch 执行的,但我没有看到 select2 搜索字段下方显示任何结果,并且它 returning 结果基于用户数据。
DashboardController.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:
"{\"results\":[{\"name\":\"Charizard\"}]}"
当 ElasticSearch return 是一个数组并且 JSON 被 return 编辑到 AJAX 调用时,会产生此错误:
已解决!
我意识到我的 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
};
},