Ruby on Railsを触ってみる ⑩検索機能 Ransackの実装

検索機能を実装してみる。某先輩のブログでRansackというgemが勧められていたので、早速使ってみよう。

Gemfileの編集をしてbundle install

gem 'ransack'

route.rbを修正して、検索用のルーティングを追加する。

  resources :tweets do
    collection do
      get 'import_csv_new'
      post 'import_csv'
      get 'archives/:yyyymm', :action => :archives, :as =>'archives'
      get 'search/:q', :action => :search, :as =>'search'
    end
  end

controllerにアクションを追加します。パラメタで受け取ったキーワードを含む結果で絞り込みます。

  # GET /tweets/search/keyword
  def search
    @tweets = @user.tweet
             .search(:text_cont => params[:q]).result
             .order(:id)
             .page params[:page]
  end

viewファイルsearch.html.erbを作成します。ほぼarchives.html.erbの流用です。

<h1><%= params&#91;:q&#93; %>の検索結果</h1>

<%= render(@tweets) %>
<% if @tweets.count == 0 %>
  <p><%= params&#91;:q&#93; %>に一致するツイートはありませんでした。</p>
<% end %>
<%= paginate (@tweets) %>

とりあえず動かしてみて、キーワードを適当に渡して見る。

もう実装できた。これは簡単。

あとは検索フォームの設置。それっぽくサイドバーに設置してみる。
サイドバーに設置するため、view/layouts/tweets.html.erbを修正する。

        <div class="span3">
          <div class="well sidebar-nav">
            <ul class="nav nav-list">
              <li class="nav-header">Search</li>
              <%= form_tag(search_tweets_path, :method => "get") do %>
                <div class="input-append">
                  <%= text_field_tag("q", params&#91;:q&#93;, :class => "span9") %>
                  <%= submit_tag "検索", :class => "btn"%>
                </div>
              <% end %>
              <li class="nav-header">Archives</li>
              <% @archives.each do |yyyymm, count| %>
              <li><%= link_to ymconv(yyyymm, count.to_s) , archives_tweets_path(:yyyymm => yyyymm)%><li>
              <% end %>
            </ul>
          </div><!--/.well -->
        </div><!--/span-->

こんな感じに。

Rails楽しい。

Add search form twata701/twice GitHub

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です