public
Fork of david/simple_auto_complete
Description: Rails: Simple, customizable, auto complete
Homepage: http://pragmatig.wordpress.com/2008/04/25/unobtrusive-autocomplete-rails-plugin/
Clone URL: git://github.com/grosser/simple_auto_complete.git
bryan-ash (author)
Sun Sep 06 08:28:30 -0700 2009
grosser (committer)
Sun Sep 06 09:43:19 -0700 2009
name age message
file .gitignore Sun Oct 26 01:23:40 -0700 2008 ignore svn [grosser]
file CHANGELOG Tue Jan 20 01:43:28 -0800 2009 new options + docs [grosser]
file README.markdown Sun Sep 06 09:43:19 -0700 2009 Using scoped instead of find Signed-off-by: Mi... [bryan-ash]
file Rakefile Tue Jan 20 01:43:28 -0800 2009 new options + docs [grosser]
directory example_js/ Sat Aug 15 07:12:46 -0700 2009 reformatting for viewing pleasure [grosser]
file init.rb Tue Jan 20 01:43:28 -0800 2009 new options + docs [grosser]
directory lib/ Sun Sep 06 09:43:19 -0700 2009 Using scoped instead of find Signed-off-by: Mi... [bryan-ash]
directory spec/ Sun Sep 06 09:43:19 -0700 2009 Using scoped instead of find Signed-off-by: Mi... [bryan-ash]
README.markdown
  • simple unobstrusive autocomplete
  • JS-library-independent
  • Controller and Model helpers

Install

script/plugin install git://github.com/grosser/simple_auto_complete.git
copy javascripts/css from example folder OR use your own

Examples

Controller

By default, autocomplete_for limits the results to 10 entries, and sorts by the autocomplete field.

class UsersController < ApplicationController
  autocomplete_for :user, :name
end

autocomplete_for takes a third parameter, an options hash which is used in the find:

autocomplete_for :user, :name, :limit => 15, :order => 'created_at DESC'

With a block you can generate any output you need (passed into render :inline):

autocomplete_for :post, :title do |items|
  items.map{|item| "#{item.title} -- #{item.id}"}.join("\n")
end

The items passed into the block is an ActiveRecord scope allowing further scopes to be chained:

autocomplete_for :post, :title do |items|
  items.for_user(current_user).map(&:title).join("\n")
end

View

<%= f.text_field :auto_user_name, :class => 'autocomplete', 'autocomplete_url'=>autocomplete_for_user_name_users_path %>

Routes

map.resources :users, :collection => { :autocomplete_for_user_name => :get}

JS

use any library you like (includes examples for jquery jquery.js + jquery.autocomplete.js + jquery.autocomplete.css)

jQuery(function($){//on document ready
  //autocomplete
  $('input.autocomplete').each(function(){
    var $input = $(this);
    $input.autocomplete($input.attr('autocomplete_url'));
  });
});

Records (Optional)

  • converts an auto_complete form field to an association on assignment
  • Tries to find the record by using find_by_autocomplete_xxx on the records model
  • unfound record -> nil
  • blank string -> nil
  • Controller find works independent of this find

Example for a post with autocompleted user name:

class User
  find_by_autocomplete :name # User.find_by_autocomplete_name('Michael')
end

class Post
  has_one :user
  autocomplete_for(:user, :name) #--> f.text_field :auto_user_name
  # OR
  autocomplete_for(:user, :name, :name=>:creator) #--> f.text_field :auto_creator_name (creator must a an User)
end

Authors

Contributors (alphabetical)

Copyright (c) 2008 Michael Grosser, released under the MIT license
Original: Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license