remote_function w RJS

Witam!

To moj pierwszy post, ale tak to jest ze nowe osoby rejestruja sie glownie ze wzgledu na to, ze potrzebuja pomocy, mysle ze jak sie podszkole to i innym zaczne pomagac.

Mam 2 pola. W pierwsze wstawiam select z kategoriami, a w 2gim podkategorie dla danej, wybranej kategorii.
Dziala to tak, ze wywoluje na select przy onchange dodatkowy kontroler i przekazuje mu ID wybranej kategorii. W normalnej sytuacji, jesli istnieja podkategorie dla danej kategorii wszystko jest ok.

Chcialem jednak to rozbudowac… jesli nie ma zadnej podkategorii w wybranej kategorii to wtedy chcialbym wywalic JS prompt i poprosic o podanie nazwy kategorii. I to mi sie nawet udalo, mam sobie w JS zmienna z wpisana nazwa nowej podkategorii i teraz kwestia jak ajaxowo dopisac ta kategorie do bazy? Moglbym recznie wpisac AJAX.update i na odpowiedni URL wykonac akcje, ale nie wiem do konca jak… Probowalem zeby mi railsy to wygenerowaly ale nie znam na to metody.

Generalnie moj RJS wyglada tak

if @sub_aggregation_categories.size == 0 page << 'var name = prompt("Ta kategoria nie zawiera jeszcze podkategorii.\n\nWpisz nazwę dla pierwszej:", "");'; remote_function :url => {:action => "create_subcategory", with => '"name="+name'} #<- TU NIE WIEM CO NAPISAC, bo to nie dziala :) else page.replace_html @dom_current, :partial => 'entry_subcategories' page[@dom_current].down.focus end
mam nadzieje ze dosc jasno opisalem :slight_smile:

Z gory dzieki.

Nie wiem czy jest jakiś helper do tego…

Możesz zawsze zrobić w application.js funkcje Javascript:

function createCategory(name) { ... }
i wywyłać ją z RJS:

page << "createCategory('testowa');"

Ogólnie to wcale nie musisz używać RJS w swojej aplikacji, jak jest wygodniej to możesz pozostać przy “normalnym” JavaScripcie i to często jest bardziej wygodne i daje większą kontrolę.

Dzięki za odpowiedź, zdaje sobię z tego sprawe ze tak moge zrobic, problem jednak jest taki ze nie wiem co konkretnie wpisac w tej funkcji zeby wywolala ona ajax na akcji create, probowalem czystym prototypem ale nie wychodzilo.

A może coś takiego:

new Ajax.Request('/categories', { method: "post", parameters: {name: "nowa_kategoria"}, onSuccess: function(response) { alet("jaha, nowa kategoria jest stworzona!"); } });
http://www.prototypejs.org/learn/introduction-to-ajax

Znalazłem inne prostsze rozwiązanie, można po prostu napisać

page << “#{remote_function(:url => {:action => ‘test’} )}”

i to wygeneruje kod AJAX za nas :slight_smile: