resources :articles do
resources :comments, shallow: true
+ collection do
+ get :search
+ end
end
選擇使用collection 原因:
因為是要對『複數資料』做操作。
在articles_controller裡加上 search action
class ArticlesController < ApplicationController
+ before_action :validates_search_key, only: [:search]
+
+ def search
+ @articles = Article.ransack({:title_or_content_or_summary_cont => @q}).result(distinct: true)
+ end
+
+ protected
+ def validates_search_key
+ @q = params[:query_string].gsub(/\\|\'|\/|\?/, "") if params[:query_string].present?
+ end
params[:query_string].gsub(/\\|\'|\/|\?/, "")
就是把搜尋關鍵字中的\
, '
, ?
去掉。後面的if params[:query_string].present?
就是說如果params[:query_string]
存在的話就執行前面的語句。
= 如果params[:query_string]
中有\
, '
, ?
就去掉
然後在controller
的開頭before_action :validates_search_key, only: [:search]
,如果執行def search
的時候先執行validates_search_key
。
@articles = Article.ransack({:title_or_content_or_summary_cont => @q}).result(distinct: true)
是ransack
規定的寫法。
以下是我的理解title_or_content_or_summary
的意思是,去查看我Articley資料庫中的title, content, summary
三個欄位。因為我希望搜尋不要只搜尋標題。其中or
表示的是只要有有一個欄位滿足條件就可以。
後面的_cont
表示的contain
也就是title, content, summary
並把title, content, summary
值 移到@q
身上,也就是去掉\
, '
, ,?
的搜尋關鍵字,
再把符合條件的這些article
拿出來,交給@articles
這個實體變數。
首先先建立search action 會呼應到的view,顯示我們搜尋到的結果touch app/views/articles/search.html.erb
+<div class="content">
+ <% if @articles.blank? %>
+ <div class="text-center">
+ 沒有符合資料!<br>
+ <%= link_to("文章專欄", articles_path, class: "btn btn-sm btn-success") %>
+ </div>
+ <% else %>
+ <div class="text-center">
+ <strong>
+ 找到 <%= @articles.count %>篇符合 "<%= @q %>" 的文章
+ </strong>
+ </div>
+ <table class="table table-hover table-bordered table-responsive">
+ <thead>
+ <tr>
+ <td>文章</td>
+ <td>內容</td>
+ <td>摘要</td>
+ </tr>
+ </thead>
+ <tbody>
+ <% @articles.each do |article| %>
+ <tr>
+ <td><%= link_to article.title ,article_path(article) %></td>
+ <td><%= article.content %></td>
+ <td><%= article.summary %></td>
+ </tr>
+ <% end %>
+ </tbody>
+ </table>
+ <% end %>
+
+</div>
再來要建立一個搜尋框,通過form_tag建立一個form表單,以便submit搜尋關鍵字到後台 touch app/views/articles/_search_bar.html.erb
+<div class="col-sm-9 col-lg-8 col-lg-offset-2">
+ <%= form_tag search_articles_path, method: :get, class: 'questions-search-form' do %>
+ <div class="input-group input-group-lg">
+ <input type="text" class="form-control" name="query_string" placeholder="關鍵字..">
+ <span class="input-group-btn">
+ <button type="submit" class="btn btn-danger">
+ <span class="glyphicon glyphicon-search"></span>
+ </button>
+ </span>
+ </div>
+ <% end %>
+</div>
我們搜尋關鍵字的名字為query_string
。
我們已經輸入了搜尋關鍵字,同時給它取了個名字叫做query_string
,所以可以通過params[:query_string]
來得到搜算關鍵字。然後就可以拿著這個關鍵字去資料庫中找東西了。
接著搜尋匡的位置,我想放在文章的首頁裡
因此到 app/views/articles/index.html.erb
+ <div class="col-md-12">
+ <%= render "articles/search_bar"%>
+ </div>