2010-12-21 10 views
1

Erstens, Entschuldigung für mein Englisch. Ich bin ein Brasilianer, der sich noch verbessert.Erstellen von Helfer-Tag mit UJS

Ich möchte ein Helper-Tag namens "collection_cascading_select" erstellen. Dieser Helfer ähnelt "collection_select", aber er hat noch ein Argument namens "source". Die "Quelle" ist die andere Sammlung in der Ansicht.

Wenn diese andere Option in der "Quelle" ausgewählt ist, muss eine JavaScript-Funktion ausgeführt werden, um ihren Wert zu erhalten. Füllen Sie dann die Sammlung "collection_cascading_select" aus, die für diesen Wert vereinbart wurde.

Das wird verwirrend! Ich bin eine Woche in diesem Problem und meine brasilianischen Brüder helfen mir nicht.

Danke!

[EDIT]

@Samo

ich es an die Arbeit, aber mit einigen Änderungen.

var success = function(response) { 

for (var item in response){ 

    var id = response[item].breed.id <-------------------- 
    var name = response[item].breed.name <------------------- 
    var option = $(document.createElement('option')).val(id).html(name) 
    dependentDropDown.append(option) 
    } 
} 

Ich verstehe nicht, wie FOR IN funktioniert.

Antwort

0

Es ist wie die Antwort, die Sie suchen klingt, ist ein Baumeister individuelle Form. Sie können Ihren Formular-Generator erstellen und von dem Rails-Formular-Generator erben und diesen Formular-Generator dann als Standard für Ihre Anwendung festlegen. Dann könnten Sie ein Element mit dem Namen dependent_dropdown oder cascading_selection usw. definieren. Dieses Element würde wahrscheinlich die ID des Quell-Dropdowns annehmen. Ihr Helfer würde einen collection_select ausgeben, aber es würde auch etwas JavaScript ausgeben, das einen AJAX-Aufruf auslösen würde, wenn sich das Quellen-Dropdown ändert.

Natürlich müssen Sie es nicht so machen. Sie könnten einfach einen collection_select verwenden, einige Attribute zum Quell-Dropdown hinzufügen (zB :class => 'source_for_dependent', :dependent => some_id), und dann ein paar JavaScript in Ihrer application.js anhängen, die nach Sammlungen mit der source_for_dependent Klasse sucht, und wenn das Ereignis ausgelöst wird, greift die ID aus das Attribut dependent und löst einen AJAX-Aufruf aus.

So oder so, hier ist ein Beispiel für Ihre JavaScript (mit jQuery)

$('select.source_for_dependent').change(function() { 
    var id = // get the id of the dependent dropdown, perhaps by $(this).attr('dependent') 
    var dependentDropDown = $('#' + id); 
    dependentDropDown.empty(); 
    var success = function(response) { 
    for (var item in response) { 
     var option = $(document.createElement('option')).val(item.val).html(item.text); 
     dependentDropDown.append(option); 
    } 
    } 

    $.get('/some_controller/some_action/' + $(this).val(), success); 
} 

Der Erfolg Handler in jQuery get Methode übergeben wird. Es benötigt eine JSON-Antwort als Argument. Wir durchlaufen die Antwort, und für jedes Element erstellen wir einen option, ziehen den Wert und den Text aus dem Element und fügen dieses dem abhängigen Dropdown-Element hinzu. Ihr Controller könnte wie folgt aussehen:

def some_action 
    @obj = SomeClass.find(params[:id]) 
    respond_to do |format| 
    format.js { render :json => @obj } 
    end 
end 

bearbeiten

welcher Controller zielen Sie ist bis zu Ihnen. Nehmen wir an, Drop-Down-A zielt auf Ressource A und Dropdown-B auf Ressource B. Ein Objekt vom Typ A sollte eine Liste von Objekten vom Typ B haben. Wenn Sie nach der show Aktion für Objekt A gehen, muss Ihre as_json Methode für Objekt A seine B Zuordnungen enthalten.This article zeigt Beispiele dafür.

Andernfalls können Sie die index Aktion für die Ressource B als Ziel verwenden. Das Erstellen einer B verschachtelten Ressource von A wäre ein einfacher Weg, um die ID A abzuschliessen, um alle Objekte vom Typ B zu erhalten, die einen Fremdschlüssel haben, der auf A zeigt.

+0

Natürlich, mein Fehler. Du müsstest der Quellauswahl eine andere Klasse geben ... Ich kann mir keinen guten Namen vorstellen, vielleicht 'source_for_dependent' oder so ähnlich. Sag, wenn meine Antwort hilfreich wäre, wie wäre es dann mit einer Abstimmung oder einem grünen Tick? :) – Samo

+0

In der FOR IN-Iteration gibt das ITEM eine Zeichenfolge und kein Objekt zurück. Da kann ich die Daten nicht manipulieren. ungerade Ich bekomme Arbeit ohne die Iteration. Andere Sache ... Ich musste den Datentyp (json) in der $ .get angeben, um zu arbeiten. Vielen Dank für Ihre Hilfe. –

+0

Es liegt an Ihnen zu wissen, was in Ihrem Antwortobjekt enthalten ist. Wenn Sie einen Haltepunkt in der Handler-Funktion festlegen und ihn mit dem Befehl "firebug" prüfen, erhalten Sie Informationen zum Zugriff auf die Eigenschaften Ihres Objekts. Wenn Sie Zuordnungen benötigen, müssen Sie möglicherweise die as_json-Methode in Ihrem Modell überschreiben, um sie einzubeziehen. Außerdem können Sie angeben, dass alle XHR-Anforderungen JSON akzeptieren, sodass Sie sie nicht für jeden AJAX-Aufruf angeben müssen. Siehe hier: http://railscasts.com/episodes/136-jquery – Samo

0

Sie könnten für so etwas suchen: Ruby on Rails Country/State Select Enigma

+0

http://stackoverflow.com/questions/3332474/how-to-make-ajax-calls-with-rails-3-using-remote-function –

+0

Diese remote_function wird dekretiert. Siehe in der dritten Antwort: http://stackoverflow.com/questions/3332474/how-to-make-ajax-calls-with-rails-3-using-remote-function Und ich möchte etwas am prägnantesten machen wie von Helfern. Und der Helfer macht die Ajax-Operation. Es ist möglich ??? –

Verwandte Themen