首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在simple_form中使用select2-rails?

如何在simple_form中使用select2-rails?
EN

Stack Overflow用户
提问于 2013-02-28 21:47:10
回答 3查看 21.6K关注 0票数 15

This select2 jquery库看起来棒极了。有一个Rails gem,但是它在文档中很轻。我想要生成一个简单的多重下拉菜单,使用自动完成.我该怎么做?

这是我的simple_form_for电话:

代码语言:javascript
复制
<%= 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 gem,但不太确定如何使它工作。

我将其添加到我的home.js.coffee文件中:

代码语言:javascript
复制
jQuery ->
    $('#selectWhereToLive').select2()

我得到了这个错误:

代码语言:javascript
复制
Uncaught query function not defined for Select2 selectWhereToLive 

有什么想法?

编辑1:

上面的simple_form_for调用生成了这个HTML:

代码语言:javascript
复制
<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: :select添加到f.input_field中--包括as: :autocomplete和未包含as: :autocomplete

没有as: :autocomplete的HTML结果如下:

代码语言:javascript
复制
<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,Yes & No选项。不太清楚它为什么要这么做。它不会从我的url属性返回值。

编辑3

@harish-shetty的建议似乎是可行的。但是现在,在通过自动完成并使用select2菜单成功找到记录之后,它绕过了我在search.rb模型上的setter方法。

基本上,我想要发生的是,一旦用户完成了表单的填写--而且我有了他们想要的邻居的所有in /名称,我想在search_neighborhoods中为这些in创建一个新的记录。

以下是我的方法:

代码语言:javascript
复制
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

代码语言:javascript
复制
  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

这就是现在请求的样子--这表明没有创建任何search_neighborhood记录:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-06 05:58:36

select2插件支持自动完成.您可以使用本机自动完成,如下所示:

代码语言:javascript
复制
<%= 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

代码语言:javascript
复制
$(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传递.

代码语言:javascript
复制
  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

你的搜索模式:

代码语言:javascript
复制
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    
票数 24
EN

Stack Overflow用户

发布于 2013-02-28 23:01:06

我相信您需要附加select来选择标记(然后从它读取数据)或输入隐藏标记,然后您需要提供'query‘函数。在您的示例中,它被附加到输入标记上,从而查找查询函数。尝试在您的as: :select调用中设置f.input_field

票数 1
EN

Stack Overflow用户

发布于 2015-11-20 06:35:56

使用as::select with集合是select2的常规方式。在select2上绑定自动完成是一个javascript问题。

这是我的代码样本。但没有自动完成。https://gist.github.com/kuboon/f692d9a844c0ff5877c8

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15146269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档