过滤结果 - Ruby on Rails

时间:2016-03-24 20:34:07

标签: ruby ruby-on-rails-4

我正在尝试构建一个基本上位于索引操作之上的过滤器。这个想法是用户可以检查某组属性(同时保留其他属性,而不管他们不关心的属性)。提交后,结果应该返回所有满足这些属性的项目(忽略未选中的属性)。

我已经在各个地方看到了一些关于如何执行此操作的代码,但我还没有看到任何显示如何构建表单以及与该表单关联的控制器操作的内容。此外,我将尝试使用大多数复选框,我没有看到很多这样做的例子。

以下是我到目前为止的样本。 :manhattan_served和:brooklyn_served只是属性的两个例子。我希望有20个这样的东西,用户可以一次检查这些属性中的5个或6个。

/app/views/experts/filtered_experts.html.erb

<%= form_tag filtered_experts_path, method: :get do %>
  <%= label_tag(:manhattan_served, "Serves Manhattan") %>
  <%= check_box_tag :manhattan_served, true%>

  <%= label_tag(:brooklyn_served, "Serves Brooklyn") %>
  <%= check_box_tag :brooklyn_served, true%>

<%= submit_tag "Filter", name: nil %> 
<% end %>

这是我在控制器中的内容

/app/controllers/experts_controller.rb

    def filtered_experts
      @experts = Expert.where(params[filtering_params])
    end

private

    def filtering_params
      params.slice(:manhattan_served, :brooklyn_served)
    end

现在,当我提交时,我每次都会返回完整列表。在查看我的rails服务器日志时,看起来这会传递给控制器​​:

    Processing by ExpertsController#filtered_experts as HTML
  Parameters: {"utf8"=>"✓", "manhattan_served"=>"true", "brooklyn_served"=>"true"}

任何想法为什么这不仅仅会让我回到布鲁克林和曼哈顿的专家那里?

谢谢!

1 个答案:

答案 0 :(得分:0)

我不完全确定您要通过过滤完成什么,所以我不确定该建议作为替代方案......

我可以告诉你,你看到它返回所有结果的原因是因为:

params[filtering_params]

rails中的Hash.slice只返回指定键的哈希副本,因此您的filtering_params()调用将返回{:manhattan_served =&gt;是的,:brooklyn_served =&gt;真正}。然后,当您执行以下操作时,将其用作哈希键:

@experts = Expert.where(params[filtering_params])

由于哈希查找显然失败,因此返回nil。如果你用nil调用.where(),就像在做:

SELECT * from experts WHERE 1=1;

您只需将该调用更改为:

即可解决此问题
@experts = Expert.where(filtering_params)

但我怀疑你以后会遇到其他问题,这取决于你过滤了多少个参数/等等。我建议查看命名范围。您可以将它们链接在一起以建立AR关系,而且人们通常会如何解决其中的一些问题。

http://guides.rubyonrails.org/active_record_querying.html#scopes