2012-01-26 7 views
8

Uaktualniam starą aplikację szyn do wersji 3.1. Aplikacja działa dość, ale mam trochę funkcji ajaxowej, którą muszę zaktualizować. (Jeśli robi to jakąkolwiek różnicę, używam jquery i coffeescript)Aktualizacja szyn do wersji 3.1 - zmiana obsługi ajax z "render: update" na answer_to

Cała istniejąca funkcja ajax została napisana przy pomocy render: updates. np.

render :update do |page| 
    page.remove "financial_tran_offset_#{params[:ftof_id]}" 
    page.replace_html 'details', :partial => 'details', :locals => {:obj => @fire} 
end 

Myślę, że nowym preferowanym sposobem jest użycie respond_to? blok do obsługi js, ale nie jestem pewien najlepszego sposobu obsługi tych różnych przypadków.

Dla pierwszego przypadku() myślę, że z linii potoku aktywów, powinienem mieć zewnętrzny js w/app/assets/javascripts/do obsługi strony javascript (np. Page.remove), ale jestem nie wiem, jak przekazać parametry do pliku js. Zgaduję, można zrobić coś takiego:

respond_to do |format| 
    format.js {:render :js => {:ftof => params[:ftof_id]} 
end 

ale nie jestem pewien, jak można to odebrać od wewnątrz pliku js. Czy jest to właściwy sposób przekazywania informacji do js? Czy jest jeszcze inna metoda, której powinienem używać?

Dla drugiego przypadku (page.replace_html) myślę, że to zostało zdeprecjonowane/usunięte z wersji 3.1 (zgodnie z apidock). Podejrzewam, że powinien to być plik js w katalogu app/assets/javascript, ale nie wiem, w jaki sposób powinienem wykonać renderowanie częściowe i przekazywanie tych informacji do js.

Dzięki za wszelkie wskazówki w tym zakresie =)

Odpowiedz

31

użyć jQuery w połączeniu z js.erb poglądów i respond_to bloków.

Cokolwiek to jest działanie (powiemy FoosController#update przez wzgląd na przykład):

render :update do |page| 
    page.remove "financial_tran_offset_#{params[:ftof_id]}" 
    page.replace_html 'details', :partial => 'details', :locals => {:obj => @fire} 
end 

staną:

respond_to do |format| 
    format.html 
    format.js  # <- this is what we're after 
end 

z plikiem widoku update.js.erb:

$('#financial_tran_offset_<%= params[:ftof_id] %>').remove(); 
$('#details').replaceWith('<%= escape_javascript(render(:partial => 'details', :locals => {:obj => @fire})) %>'); 

update.js.erb zostanie przeanalizowany przez ERb, renderowany jako JS, wysłany do klienta t przez Ajax i eval'd.

Możesz przekazać wszystko, co chcesz, do szablonów JS. W końcu są to pliki ERb. Użyj zmiennych <%= %> i instancji, tak jak w przypadku widoków HTML/ERb. Jeśli wywołasz render w widokach JS/ERb, owinąć go za pomocą escape_javascript, aby uzyskać poprawne renderowanie HTML.


render :update połączenia starych metod JavaScriptGenerator pomocnicze dla prototypu. Konwersja do jQuery jest dość prosta, ponieważ obie robią to samo: wybierz element DOM i manipuluj nim.

Oto ładna mała tabela tłumaczeń z typowymi manipulacjami.Usuń Prototype metody pomocnika z kontrolera, a miejsce ich jQuery lub JS odpowiednika w odpowiednim widoku JS/ERB:

 Prototype       jQuery/Javascript 
    in controller     in JS/ERb view (xxxxxx.js.erb) 
     ---------       ----------------- 
page.alert "message"     alert('message'); 
page.hide "id"      $('#id').hide(); 
page.insert_html \ 
     :top, "id", "content" $('#id').prepend('content'); 
     :bottom, "id", "content" $('#id').append('content'); 
     :before, "id", "content" $('#id').before('content'); 
     :after, "id", "content" $('#id').after('content'); 
page.redirect_to "url"    window.location.href = 'url'; 
page.reload       window.location.reload(); 
page.remove "id"      $('#id').remove(); 
page.replace "id", "content"   $('#id').replaceWith('content'); 
page.replace_html "id", "content" $('#id').html('content'); 
page.show "id"      $('#id').show(); 
page.toggle "id"      $('#id').toggle(); 

nie zapomnij średników na każdej linii!

+0

fajne. czy mimo to można to zrobić za pomocą coffeescript, czy ogranicza się tylko do prostej js w update.js.erb? –

+0

Jeśli naprawdę chcesz używać CoffeeScript, być może będziesz w stanie, ale wsparcie w widokach dynamicznych jest niekonsekwentne z tego, co mogę powiedzieć. (Ja osobiście wolę prosty JS.) CoffeeScript dla prostych jQuery One-Liners to trochę przesada. '$ ('# id'). dopisz ('content');' to '$ ('# id'). dopisz 'content''. Nie jest warte narzutu, aby zapisać zestaw nawiasów. JQuery jest kompaktowy i wystarczająco prosty. Równie dobrze może być z tym. – Substantial

+0

Dzięki za bardzo szczegółową odpowiedź! –

Powiązane problemy