使用 AJAX 预填充 Select2 - “未找到结果”

Posted

技术标签:

【中文标题】使用 AJAX 预填充 Select2 - “未找到结果”【英文标题】:Pre populating Select2 using AJAX - "No Results Found" 【发布时间】:2016-10-30 15:08:40 【问题描述】:

我一直在按照这个示例指南 (http://rails-select2-example.herokuapp.com/) 创建一个 select2 下拉菜单来从我的数据库中搜索国家/地区。

但是,选择框总是以“未找到结果”返回为空。为什么它不会从 js/ajax 中获取值?

查看(new.html.erb)

          <select class="form-control" id="country_select">
          </select>

控制器(Searches_controller.rb)

class SearchesController < ApplicationController
before_action :require_user
respond_to :html, :json

    def new
        @countries = Country.all
        respond_with @countries
    end
end

javascript

  $('#country_select').select2(
    theme: "bootstrap",
    ajax: 
      url: "<%= user_searches_path(format: 'json') %>",
      dataType: "json",
      results: function(data, page) 
        return  results: $.map( data, function(country, i)  
          return  id: country.id, text: country.name  
         ) 
      
    
  );

路线

resources :users do
    resources :searches
  end

搜索迁移

class CreateSearches < ActiveRecord::Migration

  def change
      t.string :country
   end
      add_index :searches, [:user_id, :created_at]

  end
end

【问题讨论】:

【参考方案1】:

可以直接使用 Rails Helper Method,而不是使用 AJAX,在国家/地区进行搜索

见下面的例子:

在您的 application_helper.rb 文件中创建一种方法:

def get_country
  Country.pluck(:name,:id)
end

在您的视图文件中:

<%= f.select :country_select, get_country, prompt: 'Select Country' %>

最后,添加js代码如下:

$("#country_select").select2(
  placeholder: "Select Country"
);

【讨论】:

啊哈好吧,我现在试试这个。使用 Rails Helper 而不是 AJAX 有什么好处。既然 AJAX 这么复杂,为什么人们还要使用它? 如果您使用 Rails,在这种情况下,下拉菜单会在初始化时填充选项。而 AJAX 主要用于具有条件条件的情况,例如,如果选择国家,则需要基于国家选择的状态。如果你有任何 JavaScript 错误,那么在这种情况下你的 AJAX 会失败。 好的,我现在收到此错误,#<0x007fc7f79217d0> 【参考方案2】:

由于您在新操作中编写了代码,因此您调用的URL是错误的, 如果您想从新操作中调用,

class SearchesController < ApplicationController
before_action :require_user
respond_to :html, :json

    def new
        @countries = Country.all
        respond_with @countries
    end
end

要么像这样更改 ajax 调用中的 url,

  $('#country_select').select2(
    theme: "bootstrap",
    ajax: 
      url: "<%= new_user_search_path(format: 'json') %>",
      dataType: "json",
      results: function(data, page) 
        return  results: $.map( data, function(country, i)  
          return  id: country.id, text: country.name  
         ) 
      
    
  );

或者把代码改成索引动作,

class SearchesController < ApplicationController
before_action :require_user
respond_to :html, :json

    def index
        @countries = Country.all
        respond_with @countries
    end
end

然后,你可以使用你的那个网址,

  $('#country_select').select2(
    theme: "bootstrap",
    ajax: 
      url: "<%= user_searches_path(format: 'json') %>",
      dataType: "json",
      results: function(data, page) 
        return  results: $.map( data, function(country, i)  
          return  id: country.id, text: country.name  
         ) 
      
    
  );

【讨论】:

嗨@sravan,所以在使用你的新操作后,选择框卡在“搜索”上,我有以下错误 Started GET "/users/1/searches/new.json?q=aus" for ::1 由 SearchesController#new 处理为 JSON 参数:"q"=>"aus", " user_id"=>"1" 用户负载 (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? [["id", 1]] 已完成 500 内部服务器错误 ActionView::MissingTemplate - 缺少模板搜索/新建、应用程序/新建 :locale=>[:en], :formats=>[:json], :variants =>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]。 那么方法调用是正确的,只需在views/searches中添加new.html.erb文件 奇怪的是已经有了那个页面,javascript 正在从 app/views/searches/new 页面运行。 (new.html.erb) k,因为你已经给了json它的搜索fir一个js文件,添加new.js.erb

以上是关于使用 AJAX 预填充 Select2 - “未找到结果”的主要内容,如果未能解决你的问题,请参考以下文章

如何格式化基于 ajax 的 Select2 预填充?

如何使用 AJAX 预加载 select2 插件?

select2 - 将获取远程数据与多个选择和预数据相结合

使用 AJAX 数据填充 Select2

Select2 - Ajax 数据 - 根据查询填充下拉列表

AJAX填充Select2不可点击