
“Public Transportation Station”:https://www.pexels.com/photo/rails-public-transportation-station-train-station-3849/ by “Charles Forerunner”:https://unsplash.com/@charles_forerunner is licensed under “Creative Commons Zero”:https://www.pexels.com/photo-license/
Autocomplete your Rails Form using Selectize.js
Help enhance your user’s experience
When using Ruby on Rails Form Helpers, it could be useful to add an autocomplete feature to fields where users might reuse data. An example of this might be a field where it’s likely that a user will reuse an email they used elsewhere in the application. One way this can be accomplished is by using Selectize.js to create a dropdown and populate it with data from the user model.
Setting up Selectize.js
To get started, you need to clone the appropriate files from the Selectize.js repository and add them to the *vendor/assets/javascripts* directory in your project. Once it is added, we can use the class name,email-autocomplete, to add Selectize.js to the field in CoffeeScript.
app/views/edit.html.erb
<%= f.text_field :email, class: "email-autocomplete" %>
app/assets/javascripts/forms.js.coffee
$(“.email-autocomplete”).selectize(options)
There are many possible options to customize your autocomplete field. Some of these include how many dropdown options are displayed, the HTML for each element, and what fields to search by. It also allows you to specify if the user can create new items. An example of these options would be:
options = {
maxOptions: 3
render:
item: (item, escape) ->
return "<div class='email-item'><span>#{escape(item.email)}</span></div>"
option: (item, escape) ->
return "<div class='email-item'><span>#{escape(item.email)}</span></div>"
valueField: ‘email’
searchField: ‘email’
create: true
}
Dropdown Data
This is all great, but currently there is nothing populating the dropdown. To do this we will return to the view and add the data to the HTML.<%= form_for @user, html: { data: { account_emails: @user.email_addresses.join(",") } } do |form| %>
From there, we can add the data to the .selectize() options:
options = {
…
onInitialize: ->
emails = this.$input.parents("form").data("account-emails").split(",")
for email in emails
this.addOption({email: email})
}
And now you have a nice looking autocomplete dropdown!

Comments
Hey Victoria! I’m trying to do the same, however I can’t manage. Can you post by any chance the whole code (controller, routes, view)?
Cheers!
Andrea
Hi Andrea!
Thanks for the question. I have a gist that includes what I’m doing for my email autocomplete: https://gist.github.com/vgonda/8ae95f2f754e65f75fa7b4f18c1cedf4
What part of it doesn’t seem to be working for you? I’d be happy to help you out!