【问题标题】:Rails doesn't handle paramsRails 不处理参数
【发布时间】:2011-01-31 07:38:30
【问题描述】:

我正在尝试实现高级搜索。

我在模型中有这个:

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)的所有条目。但是,参数确实通过了:

 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">]

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我猜问题出在 switch-case 比较:

    case key
    

    我认为注入的关键是“min_size”而不是 :min_size,这就是为什么它总是转到 else 分支。

    编辑:

    尝试将代码更改为

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

    它应该可以工作。也许:)

    【讨论】:

    • @Ghinzu,我很高兴听到!在 StackOverflow 听到您接受对您有用的答案,表示感谢。
    • 来自 SO faq:“当您确定哪个答案对您最有帮助时,通过单击答案左侧的复选框轮廓将其标记为已接受的答案。这让其他人知道您的问题得到了很好的回答。这样做很有帮助,因为它向其他人表明您从社区中获得了价值。”
    • +1 以获得好的答案。当它们像这样清晰简洁时,我喜欢它。
    【解决方案2】:

    您可以使用 Searchlogic gem 完成此操作。

    使用 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 %>
    

    网址看起来像这样

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

    【讨论】:

    • 感谢您的回答,我可能会使用该 gem,但我仍然想找出我的代码有什么问题:-)
    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2013-12-14
    相关资源
    最近更新 更多