【问题标题】:How to require a value is entered in a search form如何要求在搜索表单中输入值
【发布时间】:2010-11-24 02:33:59
【问题描述】:

我构建了一个基本搜索表单,用于查询我的应用的一个表中的一列。我关注了第 37 集 Railscast:http://railscasts.com/episodes/37-simple-search-form。请注意,我刚刚发布了另一个与搜索相关的问题,但这是一个完全不同的问题。

在我的应用程序中,搜索查询我的个人资料表的邮政编码列,并返回包含正确邮政编码的个人资料列表。

这是我的问题。目前,当用户将输入留空并点击提交按钮时,搜索会显示网站上的所有个人资料。我不希望这种情况发生。如果该字段为空白,我不希望搜索通过。我想做一个快速通知或抛出一个错误,说明用户需要输入邮政编码才能继续。

这是我的设置:

配置文件控制器

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

简介/索引.HTML.ERB

<% form_tag ('/profiles', :method => :get) do %>
    <%= text_field_tag :search, params[:search], :maxlength => 5 %>
    <%= submit_tag "Go", :name => nil %>                
<% end %>

谢谢!

【问题讨论】:

    标签: ruby-on-rails search model controller


    【解决方案1】:

    我实际上找到了一个不需要我对当前设置进行任何更改的答案。

    如果您查看我从 Railscast 复制的上面的搜索模型,您会看到 Ryan 在搜索查询的两侧都包含通配符:

    find(:all, :conditions => ['zip LIKE ?', "%#{search}%"])
    

    我根本不熟悉 sql 语法,所以我错过了。正是这些通配符让空白搜索通过并返回数据库中的所有结果。当我从该 sql 语句中删除“%'s”时,空白搜索现在返回与我们没有与所查询 zip 匹配的记录的搜索相同的结果,这就是我想要的结果。

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

    【讨论】:

    • 不幸的是,这也降低了搜索的有用性。现在它只会匹配整个单词,AFAIK。
    • 我现在只允许按邮政编码搜索,所以这正是我想要的。
    【解决方案2】:
    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 将包含您的搜索结果。通常会有一个搜索表单部分,他们都会共享。

    【讨论】:

      【解决方案3】:

      您只需要在搜索之前检查它是否为空白。

      def index
        if params[:search].blank?
          flash[:error] = "Doh! You forgot the zip code."
        else
          @profiles = Profile.search(params[:search])
        end
      end
      

      如果返回所有结果从来都不是用例,那么您可能还想从模型中删除该代码。此外,如果您在不止一个控制器操作中检查空白搜索,您应该将逻辑移动到模型中。

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 1970-01-01
        • 2014-12-22
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多