如何在搜索表单中输入值

时间:2009-08-30 06:44:50

标签: ruby-on-rails search model controller

我构建了一个基本搜索表单,用于查询我的应用程序的一个表中的一列。我跟着第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 %>

谢谢!

3 个答案:

答案 0 :(得分:1)

def index
  @profiles = Profile.search(params[:search]) unless params[:search].blank?
end

如果搜索字段为空,您可能不希望抛出错误,因为用户在第一次访问索引页时会看到该错误。要正确处理这种类型的错误消息,您需要执行以下操作之一。

  • 将表单生成和实际搜索拆分为两个单独的操作。在RESTful应用程序中,这通常是一个新的和创建操作。 (表单新增,为实际搜索创建)。
  • 为帖子添加支票,而不是获取。如果是帖子,只尝试搜索或抛出错误。否则,只显示表格。您通常会在较旧的Rails示例中看到这一点(例如2.0之前的教程)。
  • 添加一些隐藏字段,上面写着“嘿,我正在提交搜索”。这与检查帖子的想法相同,但如果您因某些原因想要所有内容,它仍然可以使用。

我的选择将是第一个。它大致看起来像这样。

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匹配的记录,这是我想要的结果。

只是想分享,以便其他人可能会在将来发现这一点。