블로그에 검색기능 추가하기
www.ruby-toolbox.com을 검색하면 위의 캡쳐화면에서와 같이 Sunspot
을 가장 많이 사용하고 있다. 거의 같은 빈도로 많이 사용하는 SunspotRails
젬은 Sunspot
을 AcitveRecord
와 연계해서 사용할 수 있도록 해 준다.
최근 인기를 얻고 있는 Elasticsearch
도 추천할만 하지만 Sunspot
과 함께 한글 검색시 형태소별로 검색이 되는 않는 문제점이 있다. 이것에 대해서 각자 해결해 보도록 하자. 이에 대한 참고문서를 아래에 링크해 두었다.
여기서는 SearchCop
이라는 젬을 사용하여 검색기능을 구현해 보기로 한다.
1
번 위치에 검색창을 붙이도록 하자.
이를 위해서 우선 Gemfile
을 열고 아래와 같이 젬을 추가하고,
gem 'search_cop'
번들 인스톨한다.
$ bin/bundle install
Post
모델 파일을 열고 아래와 같이 검색을 위한 모듈을 추가하고 검색할 속성을 지정한다.
class Post < ActiveRecord::Base
...
include SearchCop
search_scope :search do
attributes :title, :content
attributes :comment => "comments.body"
end
...
end
posts#index
액션에 검색기능을 추가하기 위해서 app/controllers/posts_controller.rb
파일을 열고 아래와 같이 변경한다.
...
def index
if params[:search]
@posts = Post.search(params[:search])
else
if @category
@posts = @category.posts.published_posts
else
if params[:category_id] == '0'
@posts = Post.uncategorized_posts
else
@posts = Post.published_posts
@posts = @posts.tagged_with(params[:tag]) if params[:tag]
end
end
@category_name = params[:category_id] == '0' ? "Uncategorized" : (@category ? @category.name : "")
end
end
...
그리고 app/views/layouts/general_layout.html.erb
파일을 열고 해당 위치에 아래와 같이 검색을 위한 파셜을 추가한다.
...
<div class='medium-3 columns' style="margin-top: 1em">
<%= render "layouts/search" %>
<div class='row'>
<div class='medium-12 columns'>
<% if user_signed_in? %>
<p><%= link_to "My Posts <small>( #{Post.myposts(current_user).size} )</small>".html_safe, list_my_posts_path %></p>
<% end %>
...
그리고 app/views/layouts/_search.html.erb
파셜 파일을 생성하고 아래와 같이 추가한다.
<%= form_tag posts_path, :method => :get do %>
<div class="row">
<div class="large-12 columns">
<div class="row collapse">
<div class="small-10 columns">
<%= text_field_tag :search, params[:search], placeholder: "search" %>
</div>
<div class="small-2 columns">
<%= button_tag icon('magnifying-glass'), class: "button secondary postfix" %>
</div>
</div>
</div>
</div>
<% end %>
이제 로컬 서버를 다시 실행하고 브라우저에서 확인한다.
지금까지 작업한 내용을 로컬 저장소로 커밋한다.
$ git add .
$ git commit -m "제10장 : 블로그에 검색기능 추가하기"
$ git tag "제10장"
References: