我构建了一个基本搜索表单,用于查询我的应用程序的一个表中的一列。我跟着第37集Railscast:http://railscasts.com/episodes/37-simple-search-form。注意我刚刚发布了另一个与搜索相关的问题,但这是一个完全不同的问题。
在我的应用中,搜索会查询我的个人资料表的邮政编码列,并返回包含正确邮政编码的个人资料列表。
这是我的问题。目前,当用户将输入留空并点击提交按钮时,搜索会显示网站上的所有配置文件。我不希望这种情况发生。如果该字段为空,我不希望搜索通过。我想做一个flash通知或抛出错误,解释用户需要输入邮政编码才能继续。
这是我的设置:
PROFILES CONTROLLER
def index
@profiles = Profile.search(params[:search])
end
简介模型
def self.search(search)
if search
find(:all, :conditions => ['zip LIKE ?', "%#{search}%"])
else
find(:all)
end
end
PROFILE / INDEX.HTML.ERB
<% form_tag ('/profiles', :method => :get) do %>
<%= text_field_tag :search, params[:search], :maxlength => 5 %>
<%= submit_tag "Go", :name => nil %>
<% end %>
谢谢!
答案 0 :(得分:1)
def index
@profiles = Profile.search(params[:search]) unless params[:search].blank?
end
如果搜索字段为空,您可能不希望抛出错误,因为用户在第一次访问索引页时会看到该错误。要正确处理这种类型的错误消息,您需要执行以下操作之一。
我的选择将是第一个。它大致看起来像这样。
def new
end
def create
if params[:search].blank?
flash.now[:error] = "Please enter a zip code to search for."
render :new
else
@profiles = Profile.search(params[:search])
render :show
end
end
在您的观看中,new.html.erb(或.haml或其他)将包含您的搜索表单,show.html.erb将包含您的搜索结果。通常会有一个部分搜索表单,他们都会共享。
答案 1 :(得分:0)
在进行搜索之前,您只需要检查它是否为空白。
def index
if params[:search].blank?
flash[:error] = "Doh! You forgot the zip code."
else
@profiles = Profile.search(params[:search])
end
end
如果返回所有结果绝不是用例,那么您可能也想从模型中删除该代码。此外,如果您在超过这一个控制器操作中检查空白搜索,则应将逻辑移动到模型中。
答案 2 :(得分:0)
我实际上找到了一个答案,不需要我对我当前的设置进行任何更改。
如果您查看我从Railscast复制的上述搜索模型,您会看到Ryan在搜索查询的两侧都包含通配符:
find(:all, :conditions => ['zip LIKE ?', "%#{search}%"])
我根本不熟悉sql语法,所以我错过了。正是这些通配符正在通过空白搜索并将所有结果返回到数据库中。当我从该sql语句中删除“%'s”时,空白搜索现在返回与搜索相同的结果,其中我们没有与所查询的zip匹配的记录,这是我想要的结果。
只是想分享,以便其他人可能会在将来发现这一点。