iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
0
自我挑戰組

rails 學習紀錄系列 第 14

[Rails] 使用 ransack 搜尋功能

  • 分享至 

  • twitterImage
  •  

第一步 安裝gem 'ransack'

第二步 路徑

   resources :articles do
     resources :comments, shallow: true
+    collection do
+      get :search
+    end
   end

選擇使用collection 原因:
因為是要對『複數資料』做操作。

第三步 Controller

在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這個實體變數。

第四步 View

首先先建立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>


上一篇
[Rails] 後台系統可以查詢自己的文章,並做CRUD。
系列文
rails 學習紀錄14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言