2009-02-05 2 views
6

Ich möchte einige Felder in einem Formular in Rails anzeigen oder ausblenden, abhängig vom Status eines ausgewählten Felds im Formular. Ich brauche (momentan) keine zweite Datenbanksuche nach den Feldern, also versuche ich, alles auf die Ansicht zu beschränken. Ich habe den Entwurf skizziert, aber ich habe einige Probleme mit den Implementierungsdetails.Wie kann ich bedingte AJAX-y Formularfelder in Rails anzeigen/verbergen?

Mein erster Gedanke war, observe_field zu verwenden und Element.show usw. aufzurufen, aber dann müsste ich ein Javascript bedingte schreiben. Das wird wahrscheinlich funktionieren müssen, aber ich möchte es vermeiden, wenn ich kann.

Ein anderer Ansatz wäre, observe_field zu verwenden, um eine RJS-Vorlage anzufordern, und replace_html, um die Felder einzufügen. Nicht schlecht, aber da ich einen form_for Block verwende, müsste ich entweder die Formularinstanz vollständig durch das RJS-Template übergeben, um es richtig zu machen.

Ich könnte auch den Datensatz bei jedem Durchlauf aktualisieren und das Formular unter den neuen Bedingungen anzeigen, aber das ist, was ich versuche zu vermeiden. Es wäre so viel einfacher, dies alles in der Ansicht zu tun. hier

Was bin ich? Was ist die gängige Praxis für bedingte Ein-/Ausblenden von Formularen in Rails?

Antwort

4

Als Rails-Entwickler empfehle ich die Einhaltung der Prinzipien von unaufdringlichem Javascript. Wenn es um Schienen geht, bedeutet das normalerweise, dass Sie nicht nur eine große Ansicht schreiben sollten, um all Ihre Funktionalität zu bewältigen. Dadurch wird die Entwicklung und Pflege Ihrer HTML-Ansicht erleichtert, Ihr Verhalten wird einfacher zu verwalten und führt in der Regel zu einem besseren Verständnis dessen, was Ihre Anwendung gerade macht. Insofern vermeide ich um jeden Preis Rails-Javascript-Helfer.

Was ich tun würde, ist Ihr Verhalten in eine Javascript-Datei zu spalten, die Sie selbst codieren. Ich benutze eine Bibliothek wie jquery (mein Favorit für diese Art von Sache ist lowpro, aber ich bin der Erste, der zugeben muss, dass ich ein bisschen in meinen Wegen bin), es ist ziemlich einfach, einen Event-Handler an bestimmte Elemente (oder an eine ganze Klasse von Elementen auf einmal).

Für eine Auswahlbox wird ein onChange-Handler ausgelöst, wenn der Benutzer die Auswahl ändert. Die -Eigenschaft für das Element wird Ihnen sagen, welche Option ausgewählt ist, und das Array options lässt Sie die zugehörige Option nachschlagen. Also, in Ihrem Handler könnten Sie so etwas wie die folgenden (mit Prototyp) tun:

function(e) { 
    var element = Event.element(e) 
    var index = element.selectedIndex 
    var option = element.options[index] 

    if(option.value == "Show fields") 
    $('hidden-fields').show() 
    else 
    $('hidden-fields').hide() 
} 
3

ich die gleiche Sache ein paar verschiedene Möglichkeiten behandeln:

<%= link_to_function(check_box_tag "model[attribute_name]") do |page| 
    page.toggle :model_attribute_name 
end-%> 

<span style="display:none;" id="model_attribute_name"> 
<%= f.text_area :other_conditional_attribute -%> 
</span> 

oder

<%= link_to_function "Conditional Item", :class => "your-style-class" do |page| 
    page.insert_html :bottom, :other_conditional_attribute, :partial => 'conditional_attribute_partial', :object => Object.new, :locals => {:local_variable => local_variable} 
end-%> 

Die rjs stuff/prototype helper sind genial.
Rails API: PrototypeHelpers
Rails API: JavascriptHelpers

1

Ich würde vorschlagen, eine einfache JQuery-Funktion entlang der Linien der Verwendung:

$('a#slick-show').click(function() { 
    $('#slickbox').show('slow'); 
    return false; 
    }); 

Für die Grundlagen der Ein-/Ausblenden in JQuery, ist es ein Tutorial here.

Verwandte Themen