15

Thisselect2 jquery库看起来很棒。有一个Rails gem,但它是非常轻的文档。 我想使用自动完成功能生成一个简单的多个下拉菜单。我怎么做?如何在simple_form中使用select2-rails?

这是我的电话simple_form_for:

<%= f.input_field :neighborhood_names, url: autocomplete_neighborhood_name_searches_path, as: :autocomplete, data: { delimiter: ',', placeholder: "Where do you want to live?"}, multiple: true, id: "selectWhereToLive", class: "span8" %> 

我已经成功安装了select2-rails宝石,但并不完全知道如何得到它的工作。

我加入到我的home.js.coffee文件:

jQuery -> 
    $('#selectWhereToLive').select2() 

和我得到这个错误:

Uncaught query function not defined for Select2 selectWhereToLive 

的思考?

编辑1:

上面simple_form_for呼叫被制造该HTML:

<input class="autocomplete optional span8" data-autocomplete="/searches/autocomplete_neighborhood_name" data-delimiter="," data-placeholder="Where do you want to live?" id="selectWhereToLive" multiple="multiple" name="search[neighborhood_names][]" size="30" type="text" url="/searches/autocomplete_neighborhood_name" value="" /> 

指示id属性正被适当地设置。

编辑2 - 更新

由于@moonfly建议,我尝试添加as: :selectf.input_field - 都与as: :autocomplete包括在内,不包括在内。

没有as: :autocomplete生成的HTML是这样的:

<input name="search[neighborhood_names][]" type="hidden" value="" /><select class="select optional span8" data-delimiter="," data-placeholder="Where do you want to live?" id="selectWhereToLive" multiple="multiple" name="search[neighborhood_names][]" url="/searches/autocomplete_neighborhood_name"><option value="true">Yes</option> 
<option value="false">No</option></select> 

它预先填充2个选项值 '是' 和 '否'。不太清楚为什么,但这就是它的作用。

更新

所以我改变了jQuery选择寻找input#ID,忘了。所以我把它设置回来,现在它正在生成选择框 - 但它是给我的那些2是&没有选项。不太确定它为什么这样做。它不会从我的url属性中返回值。

编辑3

@哈里什 - 谢蒂的建议似乎是工作。但是现在,在通过自动完成和使用select2菜单成功找到记录后,它将绕过我在search.rb模型上的设置方法。

基本上,我想要发生的是,一旦用户完成填写表格并且我有他们想要的社区的所有ID /名称,我想为这些ID在search_neighborhoods中创建一个新记录。

因此,这些都是方法,我有:

Search.rb 

    def neighborhood_names 
    neighborhoods.map(&:name).join(',') 
    end 

    # we need to put [0] because it returns an array with a single element containing 
    # the string of comma separated neighborhoods 
    def neighborhood_names=(names) 
    names[0].split(',').each do |name| 
     next if name.blank? 
     if neighborhood = Neighborhood.find_by_name(name) 
     search_neighborhoods.build neighborhood_id: neighborhood.id 
     end 
    end 
    end 

SearchController.rb

def autocomplete_neighborhood_name 
    @neighborhood = Neighborhood.select("id, name").where("name LIKE ?", "#{params[:name]}%").order(:name).limit(10) 

    respond_to do |format| 
     format.json { render json: @neighborhood , :only => [:id, :name] } 
    end  
    end 

这是一个请求是什么样子,现在 - 这表明正在创建无记录:

Started POST "/searches" for 127.0.0.1 at 2013-03-06 04:09:55 -0500 
Processing by SearchesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"7SeA=", "search"=>{"boro_id"=>"", "neighborhood_names"=>"1416,1394", "property_type_id"=>"", "min_price"=>"", "max_price"=>"", "num_bedrooms"=>"", "num_bathrooms"=>""}} 
    Neighborhood Load (0.5ms) SELECT "neighborhoods".* FROM "neighborhoods" WHERE "neighborhoods"."name" = '1' LIMIT 1 
    (0.3ms) BEGIN 
    SQL (0.8ms) INSERT INTO "searches" ("amenity_id", "boro_id", "created_at", "keywords", "listing_type_id", "max_price", "min_price", "neighborhood_id", "num_bathrooms", "num_bedrooms", "property_type_id", "square_footage", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) RETURNING "id" [["amenity_id", nil], ["boro_id", nil], ["created_at", Wed, 06 Mar 2013 09:09:55 UTC +00:00], ["keywords", nil], ["listing_type_id", nil], ["max_price", nil], ["min_price", nil], ["neighborhood_id", nil], ["num_bathrooms", nil], ["num_bedrooms", nil], ["property_type_id", nil], ["square_footage", nil], ["updated_at", Wed, 06 Mar 2013 09:09:55 UTC +00:00]] 
    (32.2ms) COMMIT 
Redirected to http://localhost:3000/searches/29 
+0

毕竟,Edit3是另一个问题。我建议你发表另一个问题。 我想你需要在控制器上允许neighbor_names。 – kuboon 2015-11-20 06:20:04

回答

24

select2插件支持自动完成。

<%= f.input_field :ac_neighborhood_ids, 
     data: { 
     placeholder: "Where do you want to live?", 
     saved: @search.neighborhoods.to_json, 
     url: autocomplete_neighborhood_name_searches_path 
     }, 
     input_html: { class: "span8 ac-select2" } 
%> 

Javscript

$(document).ready(function() { 
    $('.ac-select2').each(function() { 
    var url = $(this).data('url'); 
    var placeholder = $(this).data('placeholder'); 
    var saved = jQuery.parseJSON($(this).data('saved')); 
    $(this).select2({ 
     minimumInputLength: 2, 
     multiple: true, 
     placeholder : placeholder, 
     allowClear: true, 
     ajax: { 
     url: url, 
     dataType: 'json', 
     quietMillis: 500, 
     data: function (term) { 
      return { 
      name: term 
      }; 
     }, 
     results: function (data) { 
      return {results: data}; 
     } 
     }, 

     formatResult: function (item, page) { 
     return item.name; 
     }, 

     formatSelection: function (item, page) { 
     return item.name; 
     }, 

     initSelection : function (element, callback) { 
     if (saved) { 
      callback(saved); 
     } 
     } 

    }); 
    }); 
}); 

确保在autocomplete_neighborhood_name_searches_path动作返回散列的JSON数组:您可以按如下方式使用本机自动完成。每个散列应包含idname字段。自动完成的术语通过查询参数name传递。

def autocomplete_neighborhood_name 
    @neighborhood = Neighborhood.select("id, name").where("name LIKE ?", "#{params[:name]}%").order(:name).limit(10) 

    respond_to do |format| 
     format.json { render json: @neighborhood , :only => [:id, :name] } 
    end  
    end 

您的搜索模式:

class Search 

    attr_accessor :ac_neighborhood_ids 

    has_many :search_neighborhoods 
    has_many :neighborhoods, through: :search_neighborhoods 

    def ac_neighborhood_ids 
    neighborhood_ids.join(",") 
    end 

    def ac_neighborhoods 
    neighborhoods.map{|n| {:id => n.id, :name => n.name}} 
    end 

    def ac_neighborhood_ids=(ids) 
    search_neighborhoods.clear # remove the old values 
    ids.split(',').select(&:present?).map do |neighborhood_id| 
     search_neighborhoods.build neighborhood_id: neighborhood_id 
    end 
    end 

end  
+0

Hrmm ....我正在使用'rails3-jquery-autocomplete' gem - https://github.com/crowdint/rails3-jquery-autocomplete - 以便根据我放置的声明生成'autocomplete_neighborhood_name_searches_path'我的控制器的顶部。我应该摆脱该声明并手动创建操作?如果是这样,我应该创建哪个控制器?我的搜索控制器?这就是现在宣布自动完成的地方。 – marcamillion 2013-03-06 06:37:03

+0

这就是我过去的做法。您应该在“搜索”控制器中添加该操作,并将其注册为路由文件中的“集合”操作。当所有东西都能正常工作的时候,你应该看到像这个例子那样的自动补全工作:http://ivaynberg.github.com/select2/#ajax – 2013-03-06 07:19:46

+0

所以这里是最后一个缺失的难题....现在我终于得到了它工作 - 但是当它执行搜索时,它正在我的'search.rb'模型中绕过我的setter方法。我会用更多的代码更新这个问题。 – marcamillion 2013-03-06 09:17:04

1

我相信你需要附上select或者sel ect标签(然后从中读取数据)或输入隐藏标签,则需要提供'查询'功能。在你的情况下,它被附加到输入标签,从而查找查询功能。尝试在f.input_field电话上设置as: :select

+0

我可以有两个'as:'电话吗?其中一个目前是'as::autocomplete'。 – marcamillion 2013-02-28 23:05:44

+0

我根据您的建议更新了HTML输出的问题。简而言之,它不起作用:( – marcamillion 2013-02-28 23:10:30

+0

不,只有一个。如果你需要保持它为::autocomplete,你将不得不定义'查询'功能。 – moonfly 2013-02-28 23:11:18

相关问题