为你的Rails网站添加OpenSearch功能

阅读更多
如果你是用过Google的搜索条,就会知道,它会根据你的输入实时的列出相关的搜索项目。让我们在自己的 Rails 网站里也添加这一功能。

1. 新建application
    创建一个 controller images,它包含三个 action。再创建一个 model image,要有个字段为 filename。
ruby 代码
  1. rails searchdemo  
  2. cd searchdemo  
  3. ruby script/generate controller images index suggest you_choose  
  4. ruby script/generate model image  

2. search.xml
  在 public 目录下创建 search.xml。 URL-TO-AN-ICON-FILE要换成你自己网站icon文件的URL。 YOUR-ADDRESS换成你自己的网址。
xml 代码
 
  1. xml   version = "1.0"   encoding = "UTF-8" ?>   
  2. < OpenSearchDescription   xmlns = "http://a9.com/-/spec/opensearch/1.1/"    
  3.                        xmlns:moz = "http://www.mozilla.org/2006/browser/search/" >   
  4.     < ShortName > Image Search ShortName >   
  5.     < Description > Image Search Description >   
  6.     < InputEncoding > UTF-8 InputEncoding >   
  7.     < Image   height = "16"   width = "16"   type = "image/x-icon" > URL-TO-AN-ICON-FILE Image >   
  8.     < Url   type = "application/x-suggestions+json"   template = "http://YOUR-ADDRESS/images/suggest?filename={searchTerms}" />   
  9.     < Url   type = "text/html"   method = "GET"   template = "http://YOUR-ADDRESS/images/you_choose/{searchTerms}" />   
  10. OpenSearchDescription >   

3. Controller
     rhtml 的内用就省略了。
ruby 代码
 
  1. def  suggest  
  2.   headers["Content-Type" ] =  "application/x-suggestions+json"   
  3.   codes = Image.find(:all , :conditions =>[ "filename LIKE ?" ,params[ :filename ]+ "%" ], :limit =>10, :group => "filename" , :order => "filename" )  
  4.   @res  = codes.map{  |c | c.filename }    
  5.   render  :text  => [params[ :filename ],  @res ].to_json  
  6. end   
  7.   
  8. def  you_choose  
  9.   @image_pages @images  = paginate  :images :per_page  => 20,  
  10.                                    :order  => 'filename',  
  11.                                   :conditions  => [ "filename LIKE ?" ,params[ :filename ]+ "%" ]  
  12. end   

4. Settings
    layouts/images.rhtml 文件中,追加下面的 link。
xml 代码
 
  1. < link   rel = "search"   type = "application/opensearchdescription+xml"   title = "Search a Image"   href = "http://YOUR-ADDRESS/search.xml"   />   


    routes.rb 里,追加下边的映射。

ruby 代码
 
  1. map.connect ' :controller / :action '  


5. 进阶
    想上边那样设定的话,已经为网站追加了OpenSearch功能。可是当测试网址和实际网址不同的时候,xml 文件里的静态URL就需要修改。让我们用 url_for 将它改进。
    追加一个 action opensearch。

ruby 代码
 
  1. def  opensearch  
  2.   headers["Content-Type" ] =  "application/opensearchdescription+xml; charset=utf-8"   
  3.   render :layout  =>  false   
  4. end    

    opensearch.rhtml (当然,search.xml要删除)

xml 代码
 
  1. < OpenSearchDescription   xmlns = "http://a9.com/-/spec/opensearch/1.1/"   
  2.                        xmlns:moz = "http://www.mozilla.org/2006/browser/search/" >   
  3. < ShortName > Image Search ShortName >   
  4. < Description > Image Search Description >   
  5. < InputEncoding > UTF-8 InputEncoding >   
  6. < Image   height = "16"   width = "16"   type = "image/x-icon" > < %= @request.protocol + @request.host_with_port % > /images/image.ico Image >   
  7. < Url   type = "text/html"   method = "get"   template = "<%= url_for :only_path => false, :controller => 'images', :action => 'you_choose' %>" >   
  8.   < Param   name = "filename"   value = "{searchTerms}" />   
  9. Url >   
  10. < moz:SearchForm > < %= url_for  :only_path  = >  false,  :action  = >  'list',  :controller  = >  'images' % > moz:SearchForm >   
  11. < Url   type = "application/x-suggestions+json"   template = "<%= url_for :only_path => false, :action => 'suggest', :controller => 'images' %>?filename={searchTerms}" />   
  12. OpenSearchDescription >   


    layouts/images.rhtml 文件中的 link 也要修改。

xml 代码
 
  1. < link   rel = "search"   type = "application/opensearchdescription+xml"   title = "Search a Image"   href = "<%= url_for :only_path => false, :controller => 'images', :action => 'opensearch' %>"   >   

你可能感兴趣的:(Rails,Ruby,json,XML,Google)