[ransack] 복잡한 검색 기능 구현

12739 단어 루비Railsransack

소개



이 기사에서는 ransack를 사용한 복잡한 검색 기능에 대해 설명합니다.
다음 이미지와 같은 것을 만듭니다.



・「이름등」의 곳에는, 가게명이나 메뉴명등을 키워드로 검색할 수 있도록 했습니다.
・「매운맛(카라사)」에서는, ActiveHash로 하고 있는 것이 되고 있습니다.
・「close」는 관계 없기 때문에, 무시입니다.

코드



해당 부분 기재합니다.
관계 없는 곳은 省略 합니다.

컨트롤러


@q 이나 @p 등 기재 방법은 나누어집니다만, [:q] 도 있으므로,@q 에 통일했습니다.
検索パラメーター (검색할 때 입력한 내용)의 키를,:q 이며 queryのイニシャル 입니다.

query=질문(by Google 선생님)

설명을 마치면 binding.pry 하고 검색해 보면 좋다고 생각합니다.
검색한 모든 결과를 resultメソッド 에서 @foods 로 인스턴스 변수를 생성하고 있습니다.

food_controller.rb
class FoodsController < ApplicationController

  def index

(省略)

    @q = Food.ransack(params[:q])
  end

  def search
    @q = Food.ransack(params[:q])
    @foods = @q.result
  end

(省略)

보기


search.html.erb검색 결과를 each 메소드로 모두 표시하고 있습니다.
또한 조건 분기에서 검색 결과가 해당되지 않는 경우,
데카 데카와 "Sorry"했습니다.

여기는 특별히 말하지 않습니다.
<div class="main">
  <div class="food-contents">
  <h2 class="food-contents-title">検索結果</h2>
    <% if @foods.present? %>
    <ul class="food-lists">
      <% @foods.each do |food| %>
        <li class="list">
          <div class="food-img-content">
          <h2 class="food-post-user">
            <%= link_to user_path(food.user_id) do %>
              <% if food.user.icon.present? %>
                <%= image_tag food.user.icon, class: "icon-img" %>
              <% else %>
                <i class="fas fa-user-circle"></i>
              <% end %>
              <%= food.user.nickname %>
            <% end %>
          </h2>
          <%= link_to food_path(food) do %>
            <%= image_tag food.image, class: "food-img" if food.image.attached? %>
            <div class="food-img-info">
              <h2 class="shop-name">
              <%= food.shop_name%>
              </h2>
              <h2 class="food-name">
              <%= food.food_name%>
              </h2>
            </div>
          <% end %>
          </div>
        </li>
      <% end %>
    </ul>
    <% else %>
      <div class="non">
        <h2 class="non-title">SORRY...</h2>
      </div>
    <% end %>
  </div>
</div>
フォームのerbファイル여기 몇 시간 동안 고민했습니다.
여러 열의 한 양식에서 검색할 수 있도록 하려면_or_ 를 붙여야 합니다.

이것을 붙이지 않고 컬럼 사이에 :ArgumentError 가 나온다고 생각합니다.
메소드의 인수가 올바르지 않을 때나 수가 많거나, 적을 때에 발생하는 에러군요.

collection_select의 인수 정보


第一引数(メソッド名)・컬럼명이나 name 속성이나 id 속성을 결정
第二引数(オブジェクト)· 배열 데이터 지정
· ActiveHash 그래서, 여기를 인스턴스 변수라고 하면 오류 지옥이 됩니다. (떨림)
이번에는 SpicyLevel.all 입니다.
第三引数(value)표시 할 때 참조하는 DB의 열 이름
第四引数(name)실제로 표시되는 열 이름
オプションinclude_blank아무것도 선택하지 않을 때 표시되는 내용
(이번에는 "--"로하고 있습니다.)

그들을 근거로 아래 코드입니다.
나는 여기서 form_with 와 사요나라 하게 되었습니다.
갑자기 ransack에서 검색 기능 구현하고 있는 강자는, 만나도 안 된다고 생각합니다만.
<%# form_with、さよなら %>

<%= search_form_for @q, url: search_foods_path, class: "food-search", id:"pull-down" do |f| %>
  <%= f.label :shop_name_or_shop_name_kana_or_food_name_or_station_cont, '名前など' %>
  <%= f.text_field :shop_name_or_shop_name_kana_or_food_name_or_station_cont, placeholder: "TYPE A KEYWORD" %>
  <%= f.label :spicy_level_id_eq, '辛さ' %>
  <%= f.collection_select :spicy_level_id_eq, SpicyLevel.all, :id, :name, include_blank: '--' %>
  <%= f.submit "SEARCH" %>
<% end %>

이상입니다.
어떻습니까?

끝에



꽤 힘들었고 이것을 구현하는 데 8 시간이 걸렸습니다. 😇
그러나, 실장할 수 있었을 때는 역시 기분 좋네요.
정보화 사회의 세상에서, 검색이 불충분한 어플리케이션은 나는 미묘하지 않을까 생각했기 때문에,
망설이지 않고 노력했습니다.

또한,
다른 사이트를 보면 seed 파일을 사용하는 분이 있었습니다만,
나는 사용하지 않았다.
글쎄, 좋은가?

이하 이번 참고 사이트입니다.
Pikawaka라는 사이트는 정말 알기 쉽고 대단하다고 생각합니다.

Rails에서 rake db : seed 다시 시도
【Rails】 ransack을 사용하여 검색 기능이있는 앱을 만들자!
gem의 ransack에서 여러 열을 검색 대상으로 만드는 방법
【Rails】ransack의 사용법을 정리해 보았다
【Rails】 검색 기능의 구현 순서
[rails]ransack을 사용한 검색 기능
[Rails]ransack을 이용한 다양한 검색 폼 작성 방법 정리
Rails db:seed 이중 등록 해제
rails seed를 쓰는 방법 다양한

내일도 최선을 다하겠습니다! !

좋은 웹페이지 즐겨찾기