目前我正在尝试在项目中创建搜索,以根据用户的区域调出用户。根据我的理解,我基本上需要将搜索参数放在控制器中,将self.search方法放在模型中,然后放在视图中的表单中。
在另一个项目中,我有一个搜索,但它显示了上面的所有选项,并使用搜索来过滤掉那些不匹配的选项。对于这种情况,我不想在开头列出任何用户。我想使用搜索栏并显示该视图页面中匹配的所有用户。另外,如果用户确实有所作为,我会为用户使用Devise。以下是我的三个代码区域:
模型(user.rb):
def self.search(search)
where("state ILIKE ?", "%#{search}%")
end
Controller(welcome_controller.rb):
def index
@users = User.all.order("created_at DESC")
@newusers = User.all.order("created_at DESC").limit(5)
@differentlocations = User.all.group_by(&:state).count
render :layout => 'with_newest_members'
if params[:search]
@users = User.search(params[:search]).order("created_at DESC")
else
@users = User.all.order('created_at DESC')
end
end
查看(find.html.erb):
<%= form_tag(find_path, :method => "get") do %>
<%= text_field_tag :search, params[:search], placeholder: "Search Posts" %>
<%= submit_tag "Search", :name => nil %>
<% end %>
如果您对我有任何帮助,请告诉我=)任何其他解释将非常感谢帮助我理解,谢谢!
编辑:我知道我需要输入结果部分,但我对如何/放置它感到困惑。
乔
答案 0 :(得分:1)
解答:
问题出在我的控制器中,因为我在搜索代码之前有一个渲染命令。控制器应该是:
def index
@users = User.all.order("created_at DESC")
@newusers = User.all.order("created_at DESC").limit(5)
@differentlocations = User.all.group_by(&:state).count
if params[:search]
@users = User.search(params[:search]).order("created_at DESC")
else
@users = User.all.order('created_at DESC')
end
render :layout => 'with_newest_members'
end
神奇=)
答案 1 :(得分:0)
可能会有所帮助的两件小事:
1)在您的搜索模型中,我认为您的search
方法中存在拼写错误。它应如下所示:
def self.search(search)
where("state LIKE ?", "%#{search}%")
end
您可能还想为您的参数考虑更多描述名称,例如state
。
2)在您的表单中,您不需要在任何地方明确地写params[:search]
。将在控制器中为您生成params哈希,其中text_field的名称为键,用户输入的值为值(请参阅Ruby docs here)。在这种情况下,请使用:search
作为text_field_tag名称的名称。
<%= form_tag(find_path, :method => "get") do %>
<%= text_field_tag :search, placeholder: "Search Posts" %>
<%= submit_tag "Search", :name => nil %>
<% end %>
有关FormHelpers的更多信息here。