Використання Ransack з Ajax таблицями даних у Ruby on Rails

pic

Ransack — це гем для Rails, який використовується для створення розширених форм пошуку. Він простий у використанні. Хоча можна створювати користувацькі запити для пошуку в Rails, використання гему ransack спрощує запити, зменшуючи навантаження на розробника.

Я використовую ransack версії 2.3.2 та ajax-datatables-rails версії 0.4.3.

Додайте останню версію гему ransack у ваш Gemfile.

gem 'ransack'  
bundle install

У контролері, articles_controller.html.erb

class ArticlesController < ApplicationController  
 def index  
 @q = Article.ransack(params[:q])  
 respond_to do |format|  
 format.html  
 format.json { render json: ArticleDatatable.new(view_context, {ca: current_admin}) }  
 end  
 end  
end

У індексі статей, index.html.erb

<%= search_form_for [@q](http://twitter.com/q), :remote => true do |f| %>Автор  
<%= f.select(:author_name_cont, options_for_select(Author.order(:name).collect{|t| [t.name, t.name]}, (params[:q].nil? ? '' : params[:q][:author_name_cont])),{:include_blank => true}, {class: "form-control select2"}) %>Назва  
<%= f.text_field :title_cont, class: "form-control", value: params[:q].nil? ? '' : params[:q][:title_cont] %> Дата початку  
<%= f.text_field :date_published_gteq, class: 'form-control', value: params[:q].nil? ? '' : params[:q][:date_published_gteq] %> Дата кінця  
<%= f.text_field :date_published_lteq, class: 'form-control', value: params[:q].nil? ? '' : params[:q][:provider_expiry_lteq] %><%= f.submit "Пошук", class: "btn btn-success float-right ml-2"%><%= end %>
Автор    Назва    Дата публікації                   

Тут, в index файлі, потрібно передати params[:q], оскільки Rails не дозволяє передавати хеш як параметр, ми перетворюємо params[:q] на рядок.

class ArticleDatatable < AjaxDatatablesRails::Base    
 def view_columns    
  @view_columns ||= {    
    author: {source: "Author.name", cond: :like },    
    title: {source: "Article.title", cond: :like },    
    date_published: {source: "Article.date_published", cond: :like},    
  }    
 end     

 private    

 def data    
  records.map do |record|    
    {    
      author: record.author.name,    
      title: record.title,    
      date_published: record.date_published,    
      DT_RowId: record.id    
    }    
  end    
 end       

 def get_raw_records    
  if params[:q].nil?    
    @q = Article.select("articles.*, authors.id, authors.name")    
    .left_outer_joins(:author)    
  else     
    @q = Article.select("articles.*, authors.id, authors.name")    
    .left_outer_joins(:author).ransack(eval(params[:q].to_json)).result(distinct: true)    
  end    
  @articles = @q    
 end   
end

У таблиці даних важливо зауважити, що ми використовуємо eval(params[:q].to_json), оскільки передаємо параметри як рядок з виду, і потрібно перетворити його назад на хеш. Інтеграція хешу в таблицю даних не потребує додаткових змін у JavaScript файлі. Я поділився файлом coffee-script для вашого ознайомлення. articles.coffee

# Datatables   
$(document).on 'turbolinks:load', ->    
  table = $('#articles-table').dataTable    
    dom: 'C<"clear">lfrtip'    
    processing: true    
    serverSide: true    
    ajax: $('#articles-table').data('source')     
    pagingType: 'full_numbers'    
    columns: [    
      {data: 'author'}    
      {data: 'title'}    
      {data: 'date_published'}    
    ]  




Перекладено з: [Using Ransack with Ajax data tables in ruby on rails](https://medium.com/@emmanuvarghese/using-ransack-with-ajax-data-tables-in-ruby-on-rails-8b3464b58a65)