如何在视图中制作“过滤器”?

时间:2013-12-08 23:45:05

标签: ruby-on-rails activerecord filter

我正在开发一个Rails应用程序,我有一个很大的疑问:如何在视图中制作“过滤器”?

在我的项目中,我有一个名为Site的模型(存储网站链接),这个网站与Country的关联,与一个国家has_many网站的关联。目前,我可以(轻松)显示所有网站及其相关国家/地区,但现在我希望按国家/地区进行过滤,而不仅仅是显示网站及其所属的国家/地区。我的意思是,我想选择一个国家,只显示来自这个国家的网站。

我已经有了数据库,模型中的一切都是正确的,我知道如何用ActiveRecord做到这一点,但我不知道如何在View中做到这一点。

我在GET发送国家/地区并返回同一页面。因此,同一模型的控制器可以检查所请求的页面是否有一些参数。如果是,请显示包含所请求国家/地区的页面。但我不知道这是否是最佳方式,如果这是正确的方式 - 以及我如何正确地做到这一点。

我该怎么做?

如果你需要一些代码,我可以在这里粘贴,但我认为这不是必需的。

2 个答案:

答案 0 :(得分:1)

有几种方法(在我的头顶上)你可以做到这一点......

  1. 您可以执行一个下拉菜单,将查询参数添加到URI的末尾。然后,您将解析该(通过页面刷新或异步)并根据查询参数的内容过滤结果。示例:www.example.com/sites?country=us只能显示来自美国的网站。

  2. 您可以使用路由执行此操作,其中您的路由与GET /sites/:country_code之类的URI匹配 - 这可以以类似的方式工作,您的控制器中将有一个名为{的参数{1}}然后可以根据该参数进行过滤。在我看来,这是更清洁的实施。

  3. 同样,就个人而言,我更喜欢上面的选项2,但要么应该得到你想要的东西。

答案 1 :(得分:1)

根据您拥有的网站和国家/地区数量,我可能会立即加载所有网站和国家/地区,然后使用js显示/隐藏您想要的网站。例如,你可以这样做:

<% @sites.each do |site| %>
  <a href="<%= site.url %>" class="country-link <%= site.countries.map(&:name).join(" ") %>"><%= site.name %></a>
<% end %>

然后你可以使用例如jQuery隐藏所有这些,然后只显示下拉/链接中的哪些:

$('.country-link').hide()
$('<trigger>').on 'click', () ->
  $('.country-link').hide()
  $('<country name>').show()