2011-12-31 16 views
8

Przeglądałem wszystkie pytania i odpowiedzi na SO na ten temat, ale nadal nie mogę wykonać mojego scenariusza. Chcę wywołać akcję przycisku kliknięcia po wybraniu opcji menu rozwijanego; wydaje się być prosty i powinien być bardzo powszechny w AJAX.wybierz i zmień w formularzu Ruby na szynach

Oto stosowne fragmenty mojego kodu:

<%= form_for(@test, :html => {:id => "form_id", :name => "MyForm", :remote => "true"}) do |form| %> 
    <%= form.label "Menu1" %> 
    <%= form.select (:Menu1, [["Option1","value1"],["Option2","value2"]], :html_options=>{:onChange=>"javascript: this.form.apply_button_name.click();"}) %> 

    <!-- more select menus and text fields here --> 

    <div class="actions"> 
     <%= form.submit "Apply", :name => "apply_button_name", :remote => "true" %> 
    </div> 
<% end %> 

użyłem. „Remote =>«true»zarówno dla postaci i przycisku, ponieważ jest to jedyny sposób, aby uzyskać AJAX działa Próbowałem też z jawnymi "html_options" i "javascript:", po tym jak przejrzałem kilka odpowiedzi na SO, które sugerowały, ale to nie pomogło.Spróbowałem również na Select, i onClick zamiast na Change, ale wciąż nie ma szczęścia.

Wygenerowane HTML jest następujący:

Menu1 
    <select id="test_Menu1" name="test[Menu1]"><option value="value1">Option1</option> 
<option value="value2" selected="selected">Option2</option></select> 

Jak widać, w kodzie HTML nie ma obsługi zdarzenia onChange; CZEMU? Czy ktoś widzi, co robię źle?

Dzięki za pomoc.

Odpowiedz

14

Modyfikuj swój apel do form.select coś takiego:

<%= form.select :Menu1, [["Option1","value1"],["Option2","value2"]], {}, 
       :onChange=>"javascript: this.form.apply_button_name.click();" %> 
+0

Dzięki rabusmar, który pomógł, ale gdy wybiorę opcja1, kontroler dostaje wartość2 i vice versa. Dodałem trzecią opcję i wygląda na to, że kontroler nie dostaje opcji, którą właśnie wybrałem, ale poprzedniej! Dlaczego to robi? Sprawdziłem to, dodając do kontrolera "@ test.Menu1 =" + @ test.Menu1.to_s + "\ n". – rh4games

+0

Jest tak, ponieważ wartość nie została ustawiona podczas wysyłania formularza. Możesz użyć 'setTimeout' w swojej procedurze, aby wysłać poprawną wartość. – rabusmar

+0

Czy mogę zapytać, jak odnieść się do kodu JavaScript poza tym plikiem, zamiast wbudowanego kodu JavaScript? – Orz

3

Jeśli zbadać dokumentację:

API Dock Ruby on Rails select

widać, że wybierz formę pomocnik ma postać:

select (obiekt, metoda, opcje, opcje = {}, html_options = {})

Jeśli nic nie przekazujesz dla opcji hash (w twoim przypadku będzie to pusta tablica asocjacyjna), to formularz uważa, że ​​twój skrót html_options jest twoim hashem opcji mieszania i staje się zdezorientowany.

Sposobem sprawdzenia tego jest dodanie czegoś takiego jak alert {: onchange => "(" Cześć ");"} i sprawdzenie, czy zdarzenie pomyślnie się uruchamia, lub alternatywnie na aktualnej stronie internetowej, kliknij prawym przyciskiem myszy wybierz element i sprawdź go. Jeśli w html nie ma opcji onchange, oznacza to, że twój helper tworzący helisy faktycznie miesza opcje html z innymi opcjami. Więc, co powinna mieć:

<%= form.select (:Menu1, [["Option1","value1"],["Option2","value2"]], {}, {:onChange=>"handler();"} %> 

Pamiętaj o pustym mieszania dla OPCJI przed opcjami HTML i TY powinno być dobrze. Nie sądzę, że potrzebujesz nawet opcji html_options i javascript.

Wreszcie, jeśli onChange nie działa, spróbuj użyć onchange bez kapitału C.

+0

To nie działa. – Aravin

Powiązane problemy