2016-06-10 6 views
0

Ich habe eine Ajax-Datentabelle für meine SKUs. Dazu benutze ich den Ajax-Datatables-Rails-Edelstein. Das Suchen und Sortieren funktioniert einwandfrei, aber jetzt versuche ich eine Filterfunktion zu meiner Tabelle hinzuzufügen und es scheint nichts zu tun. Ich habe dieses Beispiel für die Filterfunktion verwendet: https://datatables.net/examples/api/multi_filter_select.html. In dem Beispiel sind in der Fußzeile ausgewählte Felder gezeichnet, aber für mich ist die Fußzeile leer. Wie der Code überhaupt nicht läuft. Ich bekomme auch keine Fehler.Rails Datatables Filter auswählen

Ich initialisiere meine Datentabelle in meiner coffeescrip Datei (assets/javascripts/vendor_skus.js.coffee), also musste ich sie in coffeescript übersetzen. Ich habe keine Erfahrung mit coffeescript oder Ajax mit Schienen, also bin ich irgendwie verloren, was schief läuft.

Wie ich mein Problem gelöst:

Die Standard-Auswahlboxen waren problematisch für meine Situation, wie ich für meine Tabelle AJAX bin mit und die Auswahlboxen schien nur auf Client-Seite Tabellen richtig zu arbeiten. Anstatt mit den Standardauswahlfeldern zu gehen, habe ich beschlossen, eigene benutzerdefinierte Filter zu erstellen. Diese sind regelmäßig Auswahlboxen wie so:

<%= select_tag "store-id", options_from_collection_for_select(@stores, "id", "name"), include_blank: true, class:"store-id form-control" %> 
<%= select_tag "status", options_for_select([ "Open", "On Hold", "Cancelled", "Closed", "Error" ]), include_blank: true, class:"form-control", multiple:true %> 

Das ist mein Coffeescript zu machen jQuery die Parameter an den Server senden und laden Sie die Tabelle Onchange:

$ -> 
    $('#orders-table').DataTable 
    processing: true 
    serverSide: true 
    retrieve: true 
    pageLength: 50 
    title: 'orders' 
    lengthMenu: [[10, 25, 50, -1], [10, 25, 50, "All"]] 
    ajax: data: (d) -> 
     d.store_id = $('#store-id').val(); 
     d.status = $('#status').val(); 
     return 

$ -> 
    $('#store-id').on 'change', -> 
    $('#orders-table').DataTable().ajax.reload() 
    return 

$ -> 
    $('#status').on 'change', -> 
    $('#orders-table').DataTable().ajax.reload() 
    return 

In Ihrem Controller, stellen Sie sicher, dass das passieren Parameter wie:

respond_to do |format| 
    format.html 
    format.json { render json: OrderDatatable.new(view_context, { store_id: params[:store_id], status: params[:status] }) } 
end 

Und dann in Ihrer Datat-Datei, verwenden Sie die Parameter, um Ihre Ergebnisse zu filtern. In diesem Fall verwende ich eine Mehrfachauswahl für den Status. Wenn der Leerwert ausgewählt ist, wird params [: status] .present? ergibt wahr. Deshalb habe ich eine Überprüfung hinzugefügt, um festzustellen, ob das erste Element eine leere Zeichenfolge ist.

def get_raw_records 
    # insert query here 
    query = Order.all 
    query = query.status(params[:status]) if params[:status].present? && (params[:status].count == 1 && params[:status][0] == "") == false 
    query = query.store(params[:store_id]) if params[:store_id].present? 
    query.joins(:store) 
    end 
+0

(1) Sie müssen CoffeeScript nicht verwenden, wenn Sie nicht möchten, können Sie immer noch plain JavaScript verwenden. (2) Ist das der richtige Einzug in Ihrem CoffeeScript? –

+0

Ich aktualisierte meine Gedankenstriche. Versuchte mit einfachem JavaScript und es funktionierte, aber es berücksichtigt nicht die Seitenumbruch (so waren nur die Werte von der ersten Seite im Dropdown-Menü auswählbar). Auch die Werte in der Dropdownliste waren nicht gleich den Werten in meiner Tabelle, so dass die Suche immer zu 0 Ergebnissen führte. Ich denke, ich werde in den Aufbau eines benutzerdefinierten Filters schauen – stoerebink

Antwort

1

Ich stieß auf das gleiche Problem bei der Umsetzung dieser. Ich fand heraus, dass das Problem mit dieser Linie war:

column.search((if val then '^' + val + '$' else ''), true, false).draw() 

wo Kaffee Skript nicht wie die folgende Bit:

, true, false

Nach dem Entfernen sie etwa so:

column.search(if val then '^' + val + '$' else '').draw() 

alles hat gut funktioniert. Der Vorbehalt dazu ist, dass ich kein Javaskript-/Coffeescript-Typ bin, also welche negativen Auswirkungen das Ergebnis hat, ist jenseits von mir. Aber wie Du kämpfe ich gerade darum, dass alle Ergebnisse im wählbaren Drop-Down-Filter erscheinen. Es zeigt nur eindeutige Werte von der aktuellen Datenseite an - was nicht hilfreich ist.

FYI, damit die Paginierung funktioniert, gehen Sie zu Ihrer Datei datatable.rb und entfernen Sie die Markierung für die richtige Zeile nach oben, die sich auf die von Ihnen verwendete Paginierung bezieht. Ich verwende "will_paginate" für Bootstrap, so Grube sah wie folgt aus:

include AjaxDatatablesRails::Extensions::WillPaginate 

Hoffnung, das hilft. Haben Sie zufällig eine Möglichkeit gefunden, alle Ergebnisse im Auswahlfilter anzuzeigen?

+0

Ich habe meine eigenen benutzerdefinierten Filter erstellt. Ich fand es wirklich ziemlich einfach zu tun, ich habe jetzt ein reduzierbares Panel mit Filtern oberhalb meiner Datentabelle, die ihren Wert an die Datentabelle übergeben und die Tabelle onchange neu zeichnen. Funktioniert gut! – stoerebink

+0

Würde es Ihnen etwas ausmachen, ein Beispiel zu geben? oder vielleicht eine Online-Dokumentation, die jemandem helfen würde, das Gleiche zu tun? – Fixnpixels

+0

Ich werde meinen Beitrag mit der von mir verwendeten Lösung aktualisieren. – stoerebink