2016-11-22 2 views
0

Ich benutze Activeadmin und habe ein Formular, wo ein Benutzer wählt, welche notebook sie eine note hinzufügen möchten.Schienen-Sammlung basierend auf vorherige Auswahl

Ich möchte jedoch in der Lage sein, diese Sammlung basierend auf dem, was der Benutzer als das Notebook ausgewählt hat, dynamisch zu ändern. Wenn ein Notebook eine notebook_type von evernote hat, möchte ich dem Benutzer nicht erlauben, einige der Notizen auszuwählen, die in Note.all enthalten sind. (Ich habe diesen Bereich mit Hilfe eines sehr netten StackOverflow-Benutzers heruntergefahren).

Als Referenz ist hier, dass Methode:

class Notebook < ActiveRecord::Base 
    has_many :notes 

    def self.notes_without_check_lists 
    all.reject { |notebook| notebook.notes.any? { |note| note.note_type == 'check_list' } } 
    end 
end 

ich einige jQuery bereits mit einem anderen Abschnitt des Formulars zu handhaben und eine mit der Ereignisänderung wie folgt aus:

$("#note_notebook_id").on 'change', (e) -> 

Aber im Wesentlichen , Möchte ich irgendwie schalten Sie die collection: zwischen Note.all und Note.notes_without_check_lists je nachdem, welches Notebook der Benutzer gewählt hat.

Vielen Dank für jede Hilfe.

Antwort

0

IMHO, die beste Lösung ist eine neue member_action erstellen, die eine Notebook-ID erhalten und eine JSON aller verfügbaren Notizen für sie zurückgeben.

Beispiel:

member_action :notes, method: :get do 
    notebook = Notebook.find params[:notebook_id] 
    render :json, notebook.notes_without_check_lists 
end 

Nun verwenden jQuery die Anfrage zu machen, wenn Notebook-ID ändern, entfernen Sie alle Optionen des alten Auswahlbox und die neuen Optionen hinzuzufügen.

Beispiel:

$("#note_notebook_id").on('change', function() { 
    var nb_id = $(this).val(); 
    $.get('http://yourdomain/admin/notebook/notes?notebook_id=' + nb_id, function(result) { 
     $('#note').empty(); 
     $.each(result.data, function(item) { 
      $('#note').append('<option value="'+item.id+'">'+item.name+'</option>'); 
     }); 
    }); 
}); 

Das ist eine Idee ... verwenden Sie es als Basis für Ihre Lösung.

Verwandte Themen