How to use Select2 with Ransack in Rails
I. Introduction: We know that Select2 is a wonderful plugin to customize select box with support for searching, tagging, remote data sets and many other options. Otherwise, Ransack is a powerful tool for searching. It's possible to use both in Rails? That what I'll show you in this article. ...
I. Introduction:
We know that Select2 is a wonderful plugin to customize select box with support for searching, tagging, remote data sets and many other options. Otherwise, Ransack is a powerful tool for searching. It's possible to use both in Rails? That what I'll show you in this article.
II. Installation:
Add gems "ransack" and "select2-rails", including javascript assets and run bundle install
Gemfile
gem "ransack" gem "select2-rails"
app/assets/javascripts/application.js
//= require select2
app/assets/stylesheets/application.css
*= require select2
**III. Select2 using data remote: **
In this example, we create new product for a company which is selected from a select's box. Because the data for company is extremely big, it'll be greate if we can use both Select2 and Ransack.
app/views/products/new.html.erb
<%= form_for Product.new, remote: true do |f| %> <%= f.label :company, t(".company") %> <%= f.select :company_id, [], {}, {class: "select-company"} %> <%= f.submit "Add" %> <% end %> <script type="text/javascript"> <%= render "javascript.js" %> </script>
For loading conpanies data, we use jQuery's AJAX methods. We can configure the way Select2 searched for remote data using the ajax option.
app/views/products/_javascript.js
$(".select-company").select2({ ajax: { url: "/jsons/companies", //URL for searching companies dataType: "json", delay: 200, data: function (params) { return { search: params.term, //params send to companies controller }; }, processResults: function (data) { return { results: data }; }, cache: true }, });
IV. Ransack and json result
We can just use the simple mode of Ransack for searching company'name when users fill the input's field in companies's selectbox.
config/routes.rb
resources :companies, only: :index
app/controllers/companies_controller.rb
class CompaniesController < ApplicationController def index @companies = Company.actives.ransack(name_cont: params[:search].to_s.strip).result end end
In the view, we only need id and name of companies in select box, so we can use an json's array to return the result.
app/views/companies/index.json.jbuilder
json.array! @companies do |company| json.id company.id json.text company.name end
V. Conclusion:
Here a powerful method to select using Select2 and Ransack. I hope you find this article useful.