- 更新日: 2015年9月2日
- Rails
Rails/jQuery UI AutocompleteでDBデータからオートコンプリート
Rails でオートコンプリート機能を実装する機会があり、jQuery UI Autocomplete を使って実現したので備忘録メモ。オートコンプリート機能とは、Google の検索窓でも表示されるような、入力済みの文字列を元に候補のメニューを表示して入力を補完してくれる機能です。Rails 用には jquery-ui-rails という gem があるので、それを利用させて頂きました。
Autocomplete | jQuery UI
joliss/jquery-ui-rails
Ajax による通信で、サーバーのDBテーブルからオートコンプリートの候補を取得して表示します。
— 環境 —
Rails 4.1.6
jquery-ui-rails 5.0.5
gem インストール
まずは必要となる jquery-rails, jquery-ui-rails の gem をインストールします。
Gemfile
1 2 |
gem 'jquery-rails' gem 'jquery-ui-rails' |
1 2 3 |
$ bundle install |
Asset Pipline の manifest でファイルを require
続いて、Asset Pipline の manifest で、必要なファイルを require する設定を行う。ここで、jquery-ui-rails の GitHub の readme を読んだところ…
Require Specific ModulesThe jQuery UI code weighs 51KB (minified + gzipped) and takes a while to execute, so for production apps it’s recommended to only include the modules that your application actually uses.
とありましたので、オートコンプリート機能に必要となる、jQuery UI Autocomplete のモジュールのみを require するように設定しました。
app/assets/javascripts/application.js
1 |
//= require jquery-ui/autocomplete |
app/assets/stylesheets/application.css
1 |
*= require jquery-ui/autocomplete |
Rails の Asset Pipline や manifest については以下を参照。
RailsのAsset Pipelineの理解とgemで管理しないJavaScriptライブラリの配置 | EasyRamble
ビューのフォームでオートコンプリートさせるフィールドに id を付与
以降、User モデルのフォームで address(住所)のフィールドをオートコンプリートさせたい場合の例として説明します。まずは、ビューのファイルを作成。
app/views/users/new.html.erb
1 2 3 4 5 |
<%= form_for(@user) do |f| %> # ... <%= f.text_field :address, id: "user_address_field" %> # ... <% end %> |
後で書く JavaScript(CoffeeScript)で利用するため、address フィールドに id を指定しておきます。ここでは、user_address_field という id にしました。
モデルにオートコンプリートの補完候補を絞り込む scope を書く
Address というモデルがあり、addresses テーブルに住所のマスターデータ的な情報が格納されていると前提します。addresses テーブルの name(住所名)カラムに候補となる住所の名前が格納されているとする。そして、この addresses テーブルの name カラムから、オートコンプリートの補完候補を引っ張ってこれるようにします。そのための scope を Address モデルに追加します。
app/models/address.rb
1 2 3 4 5 6 7 |
class Address < ActiveRecord::Base # ... scope :autocomplete, ->(term) { where("name LIKE ?", "#{term}%").order(:name) } # ... end |
LIKE 検索で、先頭一致の文字列で絞り込めるようにした。
コントローラーとルーティング
json フォーマットで絞り込んだ補完候補を出力するようにして、それを Ajax 通信で読み込むようにします。コントローラー(UsersController)に、オートコンプリートの候補を絞り込んで json のフォーマットでレンダリングするメソッドを作成します。
app/controllers/users_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class UsersController < ApplicationController # ... def autocomplete_address address_suggestions = Address.autocomplete(params[:term]).pluck(:name) respond_to do |format| format.html format.json { render json: address_suggestions } end end # ... end |
params[:term] に address フィールドに入力された文字列が入って渡ってくる寸法です。
続いてルーティング。get メソッドで params[:term] のパラメータを受け取れるようにルーティングします。
config/routes.rb
1 |
get 'users/autocomplete_address/:term' => 'users#autocomplete_address' |
jQuery UI Autocomplete 用のコードを CoffeeScript で作成、Ajax で補完候補の json データを取得
ビューのフォーム内の address フィールドに付与した user_address_field の id を用いて、オートコンプリートが働くようにします。jQuery UI Autocomplete 用のコード自体は簡単です。source: で ajax により通信して、json データのリクエストを行うように書いています。
app/assets/javascripts/autocomplete_user_address.js.coffee
1 2 3 4 5 6 7 8 9 10 11 12 |
$ -> $("#user_address_field").autocomplete source: (req, res) -> $.ajax url: "/users/autocomplete_address/" + encodeURIComponent(req.term) + ".json", dataType: "json", success: (data) -> res(data) , autoFocus: true, delay: 300, minLength: 2 |
これだけのコードで、後は jquery ui autocomplete が良しなに計らってくれます。
autoFocus: 候補メニューの最初の候補に自動フォーカス
delay: 入力されて検索実行までのディレイ時間
minLength: 候補表示するための最低の入力文字数
その他のオプションについては、以下を参考。
Autocomplete Widget | jQuery UI API Documentation
以上で、Ajax 通信によりサーバーの DB データから候補を取得して、オートコンプリート機能を実現できました。
- – 参考リンク –
- How to get Jquery UI Autocomplete working with Rails 4? – Stack Overflow
- Railsでjquery-ui autocompleteを使用する – not good but great
- jQuery UI – オートコンプリート – jQuery 入門
- JQueryで自動補完 – Qiita
- jQuery UI Autocompleteで候補をAJAXで取得&スペース区切りで絞り込み | ちいさな創々
- Rails, jQuery-ui, Autocompleteで語句候補ドロップダウン – Qiita
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!