pg_search с использованием одного текстового поля и одного поля выбора категории

Новичок в Ruby on Rails. Я пытаюсь использовать гем pg_search, но сталкиваюсь с некоторыми трудностями (да, я смотрю документацию). Мне нужна форма поиска, в которой есть как текстовое поле, так и поле выбора (категория). Вот код, который у меня есть до сих пор:

contact_info.rb

class ContactInfo < ActiveRecord::Base
...
include PgSearch
  pg_search_scope :search_by_category, (lambda do |category, query|
  raise ArgumentError unless [:prev, :cat].include?(category)
  {
      :against => category,
      :query => query
  }
  end
end

home_controller.rb

class HomeController < ApplicationController
  def index
    @contact_infos = ContactInfo.search_by_category(params[:query])
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @contact_infos }
    end
end

главная\index.html.erb

<%= form_for :search_by_category, :url => {:controller => 'home', :action => 'index'},
  :html => {:method => 'get'} do |f| %>

  <%= text_field_tag :query %>
  <%= f.label :category_id, "Category" %>
  <%= f.collection_select :category_id, Category.all,
                        :id, :name,
                        {:prompt => 'All'} %>
  <br/>
  <%= f.submit "Search" %>
<% end %>

Я получаю эту ошибку:

ArgumentError in HomeController#index wrong number of arguments (1 for 2)

...

Запрос

Параметры:

{"utf8"=>"✓","query"=>"test","search_by_category"=>{"category_id"=>"2"},"commit"=>"Search"}

Я так понимаю, что проблема именно в этой строчке:

@contact_infos = ContactInfo.search_by_category(params[:query])

но я не уверен, как именно передать обе переменные из представления (home\index.html.erb).

Спасибо!


person purplerice    schedule 04.06.2012    source источник


Ответы (1)


ОК - я понял это. Если кому поможет....

В модели contact_info.rb

class ContactInfo < ActiveRecord::Base
  include PgSearch

 ...
  pg_search_scope :search_by_category, :against => :previous_value
  scope :in_category, lambda { |category_id|
    where(:category_id => category_id)
  }
end

В контроллере home_controller.rb

class HomeController < ApplicationController
  def index

  if params[:search_by_category].nil?
    @contact_infos = ContactInfo.search(params[:query])
  else
    tmp = params[:search_by_category]
    @contact_infos = ContactInfo.search_by_category(params[:query]).in_category(tmp[:category_id])
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @contact_infos }
    end
  end
 end
end

В представлении home\index.html.erb

...
    <%= form_for :search_by_category, :url => {:controller => 'home', :action => 'index'}, :html => {:method => 'get'} do |f| %>
    <%= text_field_tag :query %>
    <%= f.label :category_id, "Category" %>
    <%= f.collection_select :category_id, Category.all,
                            :id, :name,
                            {:prompt => 'All'} %>
    <br/>
    <%= f.submit "Search" %>
<% end %>
...
person purplerice    schedule 06.06.2012