ransackで検索機能を追加する


検索機能をransackで導入してみた

作っているサイトの検索機能にransackを使ってみたので、備忘録
ほぼ参考資料の通りに行っています。

Gemfile
gem 'ransack'
ターミナル
bundle install

routing

routes.rbにcollectionでsearchを加える

routes.rb
resources :institutions do
  collection do
    get 'search'
  end
end
ターミナル
search_institutions GET /institutions/search(.:format) institutions#search

普通にgetしてもルーティングはできた

rb.routes.rb
get "institutions/search"
ターミナル
institutions_search GET /institutions/search(.:format) institutions#search

controller

controller.rb
before_action :set_q, only: [:index, :search]

def search
  @results = @q.result
end

private
def set_q
  @q = Institution.ransack(params[:q])
end

view

index.html.erb
<h1>医療機関検索</h1>
  <%= search_form_for @q, url: search_institutions_path do |f| %>
    <%= f.label :name_cont, '医療機関名' %>
    <%= f.search_field :name_cont %>
    <br>
    <%= f.submit '検索' %>
  <% end %>
search.html.erb
<% @results.each do |institution| %>  <!-- 検索結果を@resultsで受け取る -->
  <tr>
    <td>
      <% if institution.image? %>
        <%= image_tag institution.image.url, alt: "クリニック画像", class: "image" %>
      <% else %>
         <%= image_tag "default_institution_image.png", class: "image" %>
      <% end %>
    </td>
    <td><%= institution.name %></td>
    <td><%= institution.postcode %></td>
    <td><%= institution.address %></td>
    <td><%= institution.introduction%></td>
    <td><%= link_to "編集", edit_institution_path(institution.id) %></td>
    <td><%= link_to "削除", institution, method: :delete, data: {confirm: "本当に削除しますか"} %></td>
  </tr>
<% end %>

メソッド

よく使いそうなものを抜粋しました。

メソッド _eq _start _end _cont _lt _lteq _gt _gteq
説明 完全一致 前方一致 後方一致 部分一致 未満 以下 大きい 以上

参考資料

【Rails】 ransackを使って検索機能がついたアプリを作ろう!