Implementing Autocomplete Select in Rails 6
simple-form
makes creating forms that handle associations in rails a breeze. It creates a select dropdown that works really well for use cases where the number of records are few. But once the number of options in the select box gets over a certain number you would be doing your users a favor by implementing it an autocomplete box.
I ran into the same situation. I had a Contact
table that has_one: Panchayat
relation. I used simple_form
to create the association select dropdown. I wanted to add autocomplete capabilities to it. The rails autocomplete libraries were either outdated or neede jQuery
to support. I even asked on StackOverflow https://stackoverflow.com/questions/60520237/how-to-implement-autocomplete-for-association-in-simple-form-in-rails-6?noredirect=1#comment108147660_60520237 with no avail. After some more digging I used a raw javascript library all thanks to the new webpack integration of Rails.
Meet Choices
Choices is a native JS libary with no dependencies that are designed for handling select boxes. Read more at https://joshuajohnson.co.uk/Choices/
Setting up
Install Choices with
yarn add choices.js
in the project repo. The new webpack pipeline of Rails would handle all the bundling of the js code.In your
application.js
file add the below code. This would replace all the occurence of the class#dropdown-choice-select
with the choice dropdown. Create a newcss/application.css
file in the javascript folder.// Import css from js for webpack to process it correctly import '../css/application.css' // Add Choices Dropdown const Choices = require('choices.js') document.addEventListener("turbolinks:load", function() { var dropDownSelects = new Choices('#dropdown-choice-select') })
In your
application.css
file add the below line@import "choices.js/public/assets/styles/choices.css";
Using it
To use it in a form to prefill an association all you have to do is
<%= f.association :assoc_name, collection: Assoc.all(), input_html: {id: 'dropdown-choice-select'} %>
Choice would do it’s magic and convert it into an awesome autocomplete select box.
For reference https://github.com/coronasafe/coronacell/
Improve this page