Rails не обрабатывает параметры - PullRequest
2 голосов
/ 31 января 2011

Я пытаюсь реализовать расширенный поиск.

У меня есть это в модели:

def self.filter(params)
params.inject(self) do |scope, (key, value)|
  return scope if value.blank?
  case key
    when :min_size
      scope.scoped(:conditions => ["size >= ?", value])
    when :max_size
      scope.scoped(:conditions => ["size <= ?", value])
    else
      scope.scoped(:conditions => ["created_at > ?", 4.weeks.ago]) 
  end
end
end

Это в моем контроллере:

  def search
    @listings = Listing.filter(params)
    respond_to (:html)
  end

иЯ ищу с помощью этой формы:

<%= form_tag '/search', :method => "get" do |f|  %>
    <%= text_field_tag :min_size, params[:min_size] %>
    <%= text_field_tag :max_size, params[:max_size] %>
    <%= submit_tag "Search", :name => nil %>
<% end %>

Когда я пытаюсь найти Rails, кажется, игнорирует все переданные параметры и находит все записи с последним переключателем регистра ("creation_at>?", 4.weeks.тому назад).Параметры, однако, проходят:

 Started GET "/search?utf8=%E2%9C%93&min_rent=10&max_rent=35" for 127.0.0.1 at Mon Jan 31 12:25:40 +0500 2011
 Processing by ListingsController#search as HTML
 Parameters: {"utf8"=>"✓", "min_size"=>"40", "max_size"=>"50"}
 Listing Load (1.1ms)  SELECT "listings".* FROM "listings" WHERE (created_at > '2011-01-03 07:25:40.978742') AND (created_at > '2011-01-03 07:25:40.980977') AND (created_at > '2011-01-03 07:25:40.982080') AND (created_at > '2011-01-03 07:25:40.983077') AND (created_at > '2011-01-03 07:25:40.984138')

В чем здесь может быть проблема?В консоли работает нормально

>> some = Listing.filter(:min_size => 40, :max_size => 50)
=> [#<Listing id: 1, title: "1 br apartment, Paris 16e", address: "1 Rue Monsieur-le-Prince", district: "Paris 6e", size: 42, rent: 2000, created_at: "2011-01-26 18:30:57", updated_at: "2011-01-26 19:00:44">]

Ответы [ 2 ]

2 голосов
/ 31 января 2011

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

case key

Я думаю, что из инъекции ключ "min_size", а не: min_size, и поэтому он всегда идет в другую ветвь.

РЕДАКТИРОВАТЬ:

Попробуйте изменить код на

when "min_size"
  scope.scoped(:conditions => ["size >= ?", value])
when "max_size"
  scope.scoped(:conditions => ["size <= ?", value])

, и он должен работать.Может быть :)

0 голосов
/ 31 января 2011

Вы можете сделать это, используя драгоценный камень Searchlogic.

с Searchlogic вы можете делать поиск больше или меньше, чем этот:

irb> Listing.search(:size_gt => 10, :size_lt => 100)

в контроллере:

def index
  @search = Listing.search(params[:search])
end

на ваш взгляд:

<%= form_for @search do |f|  %>
  <%= f.text_field :size_gt %>
  <%= f.text_field :size_lt %>
  <%= f.submit "Search" %>
<% end %>

URL выглядят так

/listings?search[size_gt]=10&search[size_lt]=100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...