我正在我的rails应用程序上创建高级搜索功能。我想添加一个功能,我可以根据用户的姓名和性别进行搜索和过滤。我这样做是通过添加一个名为搜索模型的新模型,其中包含两列:username&性别。我从这个video和这个link中获取灵感,但是大大地定制了该功能以满足我对应用程序的需求。到目前为止,一切都流动成功,我的意思是作为页面的管理员,我可以在不同模型的两个索引之间成功导航:用户模型和搜索模型。唯一的问题是我正在努力捕获我的参数(被搜索的内容)并将其保存在控制器中,以便可以在搜索模型的索引中查看。这是我搜索模型索引的代码:
<% provide(:title, 'All users') %>
<h1>All users</h1>
<%= will_paginate %>
<%= form_tag searches_path, method: :get do %>
<%= text_field_tag :username, params[:username] %>
<%= select_tag :gender, options_for_select(@users.collect{ |u| [u.gender] }) %>
<%= submit_tag "Search", name: nil %>
<% end %>
<ul class="users">
<%= render @users %>
</ul>
<%= will_paginate %>
这是search_controller:
def index
@search = Search.all
end
def new
@search = Search.new(params[:username])
@search = Search.new(params[:gender])
end
def create
@search = Search.create(search_params)
redirect_to @search
end
private
def search_params
params.require(:search).permit(:users, :gender)
end
这是我搜索模型的索引:
<h1> Your Search Results </h1>
<% if @search.nil? %>
<p> No Results Found </p>
<% else %>
<ul class="users">
<%= raise %>
<%= @search %>
</ul>
<% end %>
<p><%= link_to 'All Users', users_path %></p>
当我在控制台中提起它时, @search
为空。但正如您在下面看到的那样,params成功保存在索引页面的URL中:
http://localhost:3000/searches?utf8=%E2%9C%93&username=stella&gender=Female
这是video解释我想要做的事情:
非常感谢任何帮助。
答案 0 :(得分:0)
好的,您必须尝试根据搜索参数搜索用户,例如gender=Female
返回所有用户Females
,对吧?然后按照说明进行操作。
在search_controller
中,您根据参数
def index
if params[:username] || params[:gender].present?
@users = User.where('true').paginate(page: params[:page], per_page: 10)
@users = @users.where(username: params[:username]) unless params[:username].blank?
@users = @users.where(gender: params[:gender]) unless params[:gender].blank?
else
@users = User.all.paginate(page: params[:page], per_page: 10)
end
end
然后searches/index.html.erb
就像这样,与users
<ul class="users">
<% @users.each do |user| %>
<%= user.username %>
..........
<% end %>
</ul>
以上部分仅用于User
搜索。现在,如果您需要保存这些搜索参数,那么您可以像这样使用
Search.create(username: params[:username],gender: params[:gender])
它将在每次搜索时保存这些参数。然后索引操作将如下所示
def index
if params[:username] || params[:gender].present?
@users = User.where('true').paginate(page: params[:page], per_page: 10)
@users = @users.where(username: params[:username]) unless params[:username].blank?
@users = @users.where(gender: params[:gender]) unless params[:gender].blank?
Search.create(username: params[:username],gender: params[:gender])
else
@users = User.all.paginate(page: params[:page], per_page: 10)
end
end
我希望这是你想要的。
<强>更新强>
首先,你错过了一些像你使用过的东西
@search = User.where('true').paginate(page: params[:page], per_page: 10)
@search = User.where(username: params[:username]) unless params[:username].blank?
@search = User.where(gender: params[:gender]) unless params[:gender].blank?
在上面的代码中,它只适用于一行而不是三行,因为你已经分离了模型User
而不是
@search = User.where('true').paginate(page: params[:page], per_page: 10)
@search = @search.where(username: params[:username]) unless params[:username].blank?
@search = @search.where(gender: params[:gender]) unless params[:gender].blank?
这就是组合,就像放username
它会起作用,而放gender
它也会起作用,但你的代码总是执行最后一行。
新查询用于搜索(如果需要,可以使用)
@search = User.where(username: params[:username]).where(gender: params[:gender]).paginate(page: params[:page], per_page: 10)
此查询相当于
SELECT "users".* FROM "users" WHERE "users"."username" = 'xyz' AND "users"."gender" = 'xyz'"
它会使条件与username
和gender
一样必须匹配,否则为假
第2点当您使用like
运算符和%male%
百分号时,它将搜索任何位置male
的任何值, lis 女性和男性它会匹配,因为女性关心男性这就是为什么搜索结果返回女性,当您搜索男性时,您需要完全搜索,如下所示。
如果误解你或我,请告知。
@search = User.where(username: params[:username]).where(gender: params[:gender]).paginate(page: params[:page], per_page: 10)