2011-01-31 3 views
2

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

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

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, похоже, игнорирует все переданные параметры и находит все записи с последним переключателем case («created_at>?», 4.weeks.ago). Тем не менее, Params не проходят:

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

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

case key 

Я думаю, что из впрыскивать ключ является «min_size»: не min_size, и именно поэтому она всегда идет в другое отделение.

EDIT:

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

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

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

+0

Это работает! Спасибо. Как я мог пропустить это ... – Ghinzu

+1

@Ghinzu, я рад слышать! Услышьте в StackOverflow, вы благодарите лучшего, приняв ответ, который сработал для вас. – hade

+0

From SO faq: «Когда вы определили, какой ответ наиболее полезен для вас, отметьте его как принятый ответ, нажав на рамку на левой стороне ответа. Это позволяет другим людям знать, что вы получили хороший ответьте на ваш вопрос. Это полезно, потому что это показывает другим людям, что вы получаете ценность от сообщества ». – hade

0

Вы можете выполнить это, используя драгоценный камень 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 %> 

URLs смотреть например

/listings?search[size_gt]=10&search[size_lt]=100 
+0

Спасибо за ответ, и я, вероятно, воспользуюсь этим камнем, но я все равно хочу узнать, что не так с моим кодом :-) – Ghinzu

Смежные вопросы