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
安裝
bundle add ransack
他有分兩種模式
.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 %>