2012-11-05 70 views
0

我已经为我的rails 3博客应用程序实现了一个简单的搜索功能。我想验证它,以这种方式,使用不匹配的关键字,或当搜索文本字段为空时,当用户单击搜索按钮时,它应显示一条消息,说明“您的搜索条件无效。请尝试使用有效的关键字”如何验证轨道上的红宝石搜索表单?

我的代码如下:

在型号后,

class Post < ActiveRecord::Base 
attr_accessible :title, :body 
validates_presence_of :search 
validates :title, :presence => true, :uniqueness => true 
validates :body, :presence => true, :uniqueness => true 
    def self.search(search) 
    if search 
     where("title LIKE ? OR body LIKE ?","%#{search.strip}%","%#{search.strip}%") 
    else 
     scoped 
    end 
    end 
end 

在柱控制器,

class PostsController < ApplicationController 
    def index  
    @posts=Post.includes(:comments).search(params[:search]) 
    .paginate(per_page:2,page:params[:page]).order("created_at DESC") 
    end 
end 

在帖子/ index.html.erb(查看)

<div class = "search"> 
<span> 
    <%= form_tag(posts_path, :method => :get, :validate => true) do %> 
    <p> 
    <%= text_field_tag (:search), params[:search] %> 
    <%= submit_tag 'Search' %> 
    </br> 
    <% if params[:search].blank? %> 
    <%= flash[:error] = "Sorry... Your Search criteria didnt match. 
    Please try using different keyword." %> 
    <% else %> 
    </p> 
    <% end %> 
    </p> 
    <% end %> 
</span> 
</div> 
+0

我尝试这样做,但没有工作。任何人都可以帮助我实现我的目标。在此先感谢... –

回答

1

加载ActiveModel使用与验证无表模型 - 也许像PostSearch的模型上,您可以添加验证就像你会为任何其他模式。

模型:

class PostSearch 
    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    attr_accessor :input 

    validates_presence_of :input 
    validates_length_of :input, :maximum => 500 

end 

和您的形式:

<%= form_for PostSearch.new(), :url=>posts_path, :method=>:get, :validate=>true do |f| %> 
    <p> 
    <%= f.label :input %><br /> 
    <%= f.text_field :input %> 
    </p> 
    <p><%= f.submit "Search" %></p> 
<% end %> 

配对与client side validations gem良好的用户体验。

信息上加载ActiveModel:

http://railscasts.com/episodes/219-active-model

Railscast源代码:

https://github.com/ryanb/railscasts-episodes/tree/master/episode-219/

+0

感谢您的帮助...将做到这一点... –

2

您可以检查是否PARAMS [:搜索]是不是空白,意味着如果文本字段为空:

if params[:search].blank? 
    flash[:notice] = "your search criteria is invalid. Please try using valid keywords" 
    render 'index' 
end 

编辑:

如果没有关键字匹配:

if @posts.nil? 
    flash[:notice] = "your search criteria is invalid. Please try using valid keywords" 
    render 'index' 
end 
+0

感谢您的帮助将做到这一点... –

+0

什么是不匹配的关键字?就像他在搜索文本字段中输入一些垃圾输入: - dfkvjsdgndfk,那么它也应该返回相同的错误消息 –

+0

我编辑了我的答案。核实。 – Thanh