TIL

# 211110 TIL ([Ruby, slim] form_for 사용하기, filter 정의 후 사용하기)

inthess 2021. 11. 11. 11:15

장기현장실습

PLSnote 이슈

#2813 노트에 고유번호를 부여하고, 통합검색 기능 추가 이슈 진행중 

  • 프린트에 나온 고유번호(activity.id)를 보고  리스트 화면에서 검색할  있도록 하기 
    • 임의의 구현 상태에서 textarea가 아닌 form_for로 input창과 submit button이 나오도록 코드를 수정
      = form_for @group_filter, method: :get, enforce_utf8: false, url: '#' do |f| 
      	.form-group 
      		= f.label t('activities.index.by_activity_id'), class: "filter-label" 
      		= f.text_field :search_activity_id , placeholder: t('activities.index.search_activity_id') 
      	= f.submit t('activities.index.filtering'), class: "float-right btn btn-primary mr-2 col-auto"
      • Group_filter 파일을 만들어 사용할  있도록 
        class GroupFilter
            extend ActiveModel::Naming
            include ActiveModel::Conversion
          
            attr_accessor :search_activity_id
          
            def initialize(group, user, filter_condition)
              @group_id = group.id  
              @user_id = user.id
              @search_activity_id = filter_condition[:search_activity_id]
            end
          
            def key
              "group_activities_#{@user_id}_#{@group_id}"
            end
           
            def attributes
              {
                search_activity_id: search_activity_id
              }
            end
          
            def persisted?
              false
            end
          
            module Scope
              def self.call(scope, filter)
                return scope if filter.nil?
          
                filter.attributes.each do |key, value|
                  scope = scope.public_send(key, value) if value.present?
                end
                scope
              end
            end
         end
      • Group.rb에 Scope 정의
        scope :search_activity_id, -> (activity_id) { Activity.joins(:map).where(maps: {group: self}).where("activities.id like ?", "%#{activity_id}%") }
    • 검색 결과는 검색한 번호가 포함된 노트 리스트를 보여주는데 맵별로 나타내는 코드 구현 
      • group_filter를 사용하기 위해 인스턴스 변수 생성
        ...
        
        - else 
        	- filter_conditions = params[:group_filter] || {} 
        	- @group_filter = GroupFilter.new(group, current_user, filter_conditions)​
      •  리스트로 보여주기 위해 Maps_controller.rb에 필터링된 맵리스트를 정의해줌
        @maps = @maps.joins(:activities).where("activities.id like ?", "%#{params[:search_activity_id]}%") if params[:search_activity_id].present?
    • 노트 리스트를 보여주는 것에 대해 개발자님과 회의
      •  리스트 안에 노트리스트를 보여주는데, 몇개 이상이 되면 페이지네이션해서 보여주자는 의견이 있었으나, 만약  마다 노트리스트 페이지네이션이 필요하면 URL 겹치는 문제 발생 
      • 새로운 방안을 모색하던 중, 결국 메인에서 그룹 카드 밖에 검색창을 두고 결과는 새로운 UI(page)로 나타내기로 결정 -> 여기에서 노트 리스트를 보여주는데 15개 기준으로 페이지네이션해서 보여줌
        • 여기에 나타나는 노트 리스트는 모든 그룹, 모든 맵이  섞여있는 리스트이기 때문에 필터를 다시 작성 해야함