在我的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 %>
答案 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。
我希望这会给你一些如何前进的想法。