0

したがって、この宝石と simple_formを使用して複数のオートコンプリートを実装しようとしていますが、エラーが発生しています。

私はこれを試しました:

<%= f.input_field :neighborhood_id, collection: Neighborhood.order(:name), :url => autocomplete_neighborhood_name_searches_path, :as => :autocomplete, 'data-delimiter' => ',', :multiple => true, :class => "span8" %>

これは私が得るエラーです:

undefined method `to_i' for ["Alley Park, Madison"]:Array

私のパラメータでは、これを送信していneighborhood_idます:

"search"=>{"neighborhood_id"=>["Alley Park, Madison"],

そのため、これらの値に ID を使用することさえありません。

誰にもアイデアはありますか?

編集1:

@jvnill の質問に答えて、私はparams[:search]コントローラーで明示的に何もしていません。検索は新しいレコードを作成し、検索していlistingsます。

私の Searches Controllercreateアクションでは、単純に次のようにしています。

@search = Search.create!(params[:search])

それから私のsearch.rb(すなわち検索モデル)はこれを持っています:

def listings
    @listings ||= find_listings
end

private
  def find_listings
    key = "%#{keywords}%"
    listings = Listing.order(:headline)
    listings = listings.includes(:neighborhood).where("listings.headline like ? or neighborhoods.name like ?", key, key) if keywords.present?
    listings = listings.where(neighborhood_id: neighborhood_id) if neighborhood_id.present?
    #truncated for brevity
    listings
  end
4

2 に答える 2

1

まず第一に、フォームが近隣の名前ではなく ID を返す場合、これはより簡単になります。私はまだgemを使用していないので、それがどのように機能するのかよくわかりません. readme を読むと、ID が返されると書かれていますが、名前だけを取得する理由がわかりません。ID を返す方法がわかれば、それに合わせて以下のコードを変更できると確信しています。

近隣と検索の間に結合テーブルを作成する必要があります。これを search_neighborhoods と呼びましょう。

rails g model search_neighborhood neighborhood_id:integer search_id:integer
# dont forget to add indexes in the migration

その後、モデルをセットアップします。

# search.rb
has_many :search_neighborhoods
has_many :neighborhoods, through: :search_neighborhoods

# search_neighborhood.rb
belongs_to :search
belongs_to :neighborhood

# neighborhood.rb
has_many :search_neighborhoods
has_many :searches, through: :search_neighborhoods

アソシエーションをセットアップしたので、セッターと属性をセットアップする必要があります

# search.rb
attr_accessible :neighborhood_names

# this will return a list of neighborhood names which is usefull with prepopulating
def neighborhood_names
  neighborhoods.map(&:name).join(',')
end

# we will use this to find the ids of the neighborhoods given their names
# this will be called when you call create!
def neighborhood_names=(names)
  names.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

# view
# you need to change your autocomplete to use the getter method
<%= f.input :neighborhood_names, url: autocomplete_neighborhood_name_searches_path, as: :autocomplete, input_html: { data: { delimiter: ',', multiple: true, class: "span8" } %>

最後になりましたが、更新することですfind_listings

def find_listings
  key = "%#{keywords}%"
  listings = Listing.order(:headline).includes(:neighborhood)

  if keywords.present?
    listings = listings.where("listings.headline LIKE :key OR neighborhoods.name LIKE :key", { key: "#{keywords}")
  end

  if neighborhoods.exists?
    listings = listings.where(neighborhood_id: neighborhood_ids)
  end

  listings
end

以上です :)

更新: f.input_field の使用

# view
<%= f.input_field :neighborhood_names, url: autocomplete_neighborhood_name_searches_path, as: :autocomplete, data: { delimiter: ',' }, multiple: true, class: "span8" %>

# model
# 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
于 2013-02-21T14:40:41.237 に答える
0

あなたの問題は、近隣モデルから値を収集する方法です

 Neighborhood.order(:name)

名前の配列を返します。IDも収集する必要がありますが、名前を表示するだけで収集を使用してブロックを渡すことができます。

Neighborhood.collect {|n| [n.name, n.id]}

とにかくその動作もモデルに属しているため、シアター機能を元に戻したい場合は、名前で並べ替えるように Neighborhood クラスでスコープを宣言します。

edit>スコープ/クラスメソッドを近隣モデルに追加するには、通常、次のようにします

scope :desc, where("name DESC")

次のようなものを書くことができますよりも:

Neighborhood.desc.all

これは配列を返すため、.collect を許可しますが、select オプションで認識される name および id 属性を取得する方法は他にもあります。

于 2013-02-14T13:14:15.343 に答える