多筆資料除了能夠分頁瀏覽之外,也需要能夠用字串搜尋來列出,而找出來的筆數過多也要能夠分頁列出,接續昨天的內容就可以建置出來。
簡單搜尋功能建置
只要更動兩個地方就可運作了
# 在 app/views/bibles/index.html.erb 的適當位置,加入以下的 search form
<% form_tag bibles_path, :method => 'get' do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
</p>
<% end %>
# 再把剛才編輯過的 app/controllers/bibles_controller.rb 部份,更改成:
@bibles = Bible.paginate :page => params[:page],
:conditions => ['txt like ?', "%#{params[:search]}%"]
馬上就可以做聖經內容的字串查詢,而且沒有什麼中文字碼的問題。
將搜尋字串反白處理
搜尋後把所 search 的字串用粗體或者不同的顏色標示出來,可更醒目些,
# 修改 app/views/bibles/index.html.erb,將原來這一行 <td><%=h bible.txt %></td> 改成:
<td><%= highlight(bible.txt, params[:search], highlighter = '<b style="color:black;background-color:#ffff66">\1</b>') -%></td>
可從http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M001729看詳細的語法說明。
然而回到在第八日的例子中曾用到反白的例子,最初會看不懂這個寫法:
<%= highlight(highlight(@text, params[:forward]), 'stat=Sent', highlighter = '<b style="color:black;background-color:#ffff66">\1</b>') -%>
其實是將內層第二個 highlight 的結果,作為外層第一個 highlight 的 text,而內層 highlight 所強調的轉信地址,用一般的粗體字標示出,而外層 highlight 標示 'stat=Sent' 的字樣,用黃底黑色的粗體字標示,這樣的方式才不會把兩種標示的目的都用同一種 highlight 標示出來。
斑馬條紋似的table
常見的 table 像鐵人賽的HTML table 會有一白一淺藍地列出一行一行來,較有層次;要做到同樣的效果,可以加個簡單語法就完成:
# app/views/layouts/bibles.html.erb 將額外的 option.css 碼加在整個 bibles 的 layout template 上
<%= stylesheet_link_tag 'option' %>
# 編輯一個 public/stylesheets/option.css
.even {
background-color:#EDF5FF;
}
# 修改 app/views/bibles/index.html.erb
...
<% for bible in @bibles %>
<tr class="<%= cycle("even", "odd") -%>">
<td><%=h bible.engs %></td>
...