为用户索引结果提供上下文

时间:2011-11-17 15:43:07

标签: ruby-on-rails ruby-on-rails-3

在我的Rails 3应用程序中,我有一个使用复选框过滤的用户索引。我想为过滤的结果提供一些上下文。如果我检查一下家乡,我想提供一些对话框,上面写着“20个人来自你的家乡”或其他什么。有没有办法做到这一点很容易掌握?

我知道足以返回每个搜索使用<%= @users.count %>呈现的用户数,但是如何根据搜索参数添加上下文?

以下是我的代码示例:

<%= search_form_for @q, :url => search_users_path, :html => {:method => :post} do |f| %>
  <table id="careerCriteria">
    <tr>
      <td class="head">Hometown:</td>
      <td></td>
    </tr>
    <tr>
      <td class="normal"><%= current_user.profile.hometown %></td>
      <td class="check"><%= f.check_box :profile_hometown_cont, {}, "#{current_user.profile.high_school}", '' %></td>
    </tr>
<% end %>
<% @users.each do |user| %>
<div class="userSnapshot">
...
</div>
<% end %>

1 个答案:

答案 0 :(得分:0)

首先,检查has_scope gem。它非常适合简单的过滤器需求。如果你需要更复杂的东西,你可能想要自己动画。

创建一个符合ActiveModel的类并使用form_for

例如,在app/models/user_filter.rb中添加类似的内容:

class UserFilter
  extend ActiveModel::Naming
  include ActiveModel::Conversion

  def persisted?
    false
  end

  attr_accessor :hometown, :user

  def initialize(user, attributes = nil)
    @user = user
    if attributes
      attributes.each do |name, value|
        send "#{name}=", value
      end
    end
  end

  def count
    @count ||= users.count
  end

  def users
    if hometown?
      User.where(:hometown => user.hometown)
    else
      User.scoped
    end
  end

  def hometown?
    hometown == "1"
  end

  def message
    if hometown?
      "There are #{count} users from your home town"
    else
      "There are #{count} users"
    end
  end

end

现在,您可以使用UserFilter作为索引操作,而不是User - 类:

def index
  @user_filter = UserFilter.new(current_user, params[:user_filter])
end

在您看来(简化):

<%= form_for @user_filter, :path => users_path, :method => :get do |f| %>
  <%= f.check_box :hometown %>
<% end %>

<%= @user_filter.message %>

<% @user_filter.users.each do |user| %>
  <td><%= user.name %></td>
<% end %>

我会从这样的事情开始,但会很快创建一些其他类来治愈重复检查消息和内容。

ActiveModel起初有点难以习惯,所以请稍微玩一下并好好阅读docs

我希望这会给你一些如何前进的想法。