Form "Show" -> Button -> Funkcja JS -> Ajax -> controller -> render: nothing

Witajcie,

Chcę mieć na formularzu przycisk, który uruchomi operację na bazie danych i odświeży tylko obiekt DataTable, a nie całą stronę. Zrobiłem tak:

w pliku routes.rb dodałem wpis:

  resources :insurances do
    ...    
    patch 'numbering_groups', on: :member
    ...
  end

Na formularzu “Show” postawiłem przycisk:

<button id="insurance-groups-numbering-and-refresh" ajax-path="<%= numbering_groups_insurance_path(@insurance) %>" class="btn btn-success glyphicon glyphicon-sort-by-attributes">Numeruj grupy</button>

w pliku numbering.js wpisałem:

  $('#insurance-groups-numbering-and-refresh').click(function() {
    $.ajax({
      url: $(this).attr('ajax-path'),
      type: 'PATCH',
      async: false
    });
    oInsuranceGroupstable.ajax.reload();
    oInsuranceGroupstable.order([2, 'asc']);
    oInsuranceGroupstable.draw();
  });
  • info:
    oInsuranceGroupstable - jest obiektem jQuery Datatable, który ma być odświeżony po wykonaniu operacji na danych.

w insurances_controller.rb:

  def numbering_groups
    @insurance = Insurance.find(params[:id])

    @insurance.reorganize_group_numbers
    render :nothing => true and return
  end

No i w modelu jest funkcja (“reorganize_group_numbers”), która wykonuje właściwą operację na bazie.

No i działa to, ale nie wiem, czy jest to poprawnie zrobione (zgodnie ze sztuką)
Powiedzcie proszę, czy to co zrobiłem “trzyma standard”, czy jej popeliną… szczególnie to

render :nothing => true and return

and return jest kompletnie niepotrzebne, poza tym spoko. Mógłbyś ewentualnie odpowiadać różnym kodem i np. jakimś JSONem w zależności od tego, czy reorganize_group_numbers się udało. Sprawdź też co się dzieje jeśli rekord dla którego próbujesz tę akcję odpalać nie istnieje (pójdzie wtedy 404).

Dzięki za odpowiedź.

A mógłbyś dopisać mały szkielet jak powinienem to:

…dodać?

… Byłbym bardzo wdzięczny :slight_smile: