iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

Rails 手工打造自己的部落格 系列 第 26

Rails 手工打造自己的部落格 26 - 搜尋

  • 分享至 

  • xImage
  •  

V 建立搜尋框 (表單)
純HTML, 表單最重要就是action 跟 method( 不寫的話 , 預設是用get )

<form action="">
	<input type="search" name="keyword" >
	<button> Search </button>
</form>
=> 輸入123
=> 路徑: /articles?keyword=123 

From Helper

        #不寫路徑預設會送給自己 , 方法也可以留空method:''
<%= form_with(url: '', method: :get)  do |f| %>
	<%= f.search_field :keyword %>
	<%= f.submit 'Search' %>
<% end %>

article C > index

def index
	if params[:keyword]
		@articles = Article.where( "title LIKE '%#{params[:keyword]}%'" OR " content LIKE '%#{params[:keyword]}%'" ).order(id: :desc)
	else
		@articles = Article.order(id: :desc)
	end
end

按下搜尋後 , 讓輸入框的字留下( 把抓到的keyword 塞回去 )
清除搜尋框 : 給一個回到 index 的 link ( 效果就等同取消搜尋 )

<%= form_with(url: '', method: :get)  do |f| %>
	<%= f.search_field :keyword value: params[:keyword] %>
	<%= link_to  '取消',  article_path  %>
	<%= f.submit '搜尋' %>
<% end %>

把search的邏輯包進 model

article Model
def self.search(keyword)
	if keyword
		where("tilte LIKE '%#{keyword}%' OR content LIKE '%#{keyword}%'")
	else
		all
	end
end

articles_controller
def index
	keyword = params[:keyword]
	@articles = Article.search(keyword).order(id: :desc)
end

Ransack

安裝

bundle add ransack

他有分兩種模式

  • Simple Mode (簡單模式)
  • Advanced Mode (進階版)
  1. Simple Mode
    Rnasck 會送你一個 .ransck的方法, 把官網的範例直接套用在index
    默認的搜索參數為 :q
def index  
	@q = Person.ransack(params[:q])  
	@people = @q.result(distinct: true)  
end                 # distinct 搜到過的不會再搜一次

要修改搜索參數 可以去
config資料夾裡面的 initializers新增一個ransack.rb的檔案 ,
( 檔名可以隨意 , 因為在 initializers裡面的設定檔在rails 啟動之後都會自動執行, 但寫ransack.rb日後可以方便調整 )
在裡面放上以下官方設定
config/initializers/ransack.rb

Ransack.configure do |c|  
	# Change default search parameter key name.  
	# Default key name is :q  
	c.search_key = :query  
	# Change whitespace stripping behavior.  
	# Default is true  
	# 自動清除"字串內的空格"
	c.strip_whitespace = false
end

V 搜尋 helper

<%= search_form_for @q do |f| %>

  # Search if the name field contains...
  # 搜索名稱字段是否包含
  <%= f.label :name_cont %>
  <%= f.search_field :name_cont %>

  # Search if an associated articles.title starts with...
  # 搜索關聯的articles.title 是否以以下內容開頭
  <%= f.label :articles_title_start %>
  <%= f.search_field :articles_title_start %>

  # Attributes may be chained. Search multiple attributes for one value...
  # 屬性可以是鏈接的。搜索多個屬性以獲得一個值
  <%= f.label :name_or_description_or_email_or_articles_title_cont %>
  <%= f.search_field :name_or_description_or_email_or_articles_title_cont %>

  <%= f.submit %>
<% end %>

要從model 撈出check boxes

<%= search_form_for @search, url: search_zoos_url do |f| %>
	<% Animal.all.uniq.each do |animal| %>
		# the check_box helper will not work as effectively here
		<%= check_box_tag('q[animals_name_cont_any][]', animal.name) %>
		<%= animal.name %>
	<% end %>
	<%= f.submit "Search" %>
<% end %>

上一篇
Rails 手工打造自己的部落格 25 - 留言
下一篇
Rails 手工打造自己的部落格 27 - 部屬
系列文
Rails 手工打造自己的部落格 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言