Wciagniecie rxml do metody ajaxa

Mam metode wywolywana przez ajaksa. Wywoluja ona sobie metode pomocniczą “prepare_quote()” ktora przygotwuje zmienne i zwraca plik xml (z szablonu prepare_quote.rxml) za pomoca

return render_to_string :layout => false

Problem w tym, że wcale jednak nie zwraca mi xml. Zamiast tego zwraca mi bezużyteczny JavaScript którego nie wiem jak się pozbyć. Może muszę używać buildera bezpośrednio w kontrolerze zamiast polegać na rxml?

Chodzi mi o to, że mam aplikację ktorej formularz ma pełno wywołań ajaksa. W końcu dochodzi do wysłania i wtedy: sterowanie idzie ajaksem (bo bylo remote_form_tag()) do metody która parsuje dane z formularza, buduje xml (używam to rxml) i potem ma wywołać zupełnie zewnętrzny web serwice. Niestety nie mam jak odebrać pliku *.rxml :frowning:

A czy to wywolanie idzie jako replace_html w render :update ?
a jesli nie to czy jako paramett form_remote_tag jest podany element, ktory ma byc nadpisany?
Bo wyglada na to, ze wlasnie tu lezy problem.
Chcesz zrobic wywolanie AJAXowe (w sumie to je robisz) ale nie powiedziales co zrobic z wynikiem.

[quote=Adamh]A czy to wywolanie idzie jako replace_html w render :update ?
a jesli nie to czy jako paramett form_remote_tag jest podany element, ktory ma byc nadpisany?
Bo wyglada na to, ze wlasnie tu lezy problem.
Chcesz zrobic wywolanie AJAXowe (w sumie to je robisz) ale nie powiedziales co zrobic z wynikiem.[/quote]
Nie robię żadnego render :update bo dla RJS tego nie powinno się robić (tak piszą w książce). Także w form_remote_tag nic nie nadpisuję. Po prostu form_remote_tag wywołuje metodę, która zbiera to co przyszło i wywołuje metodę pomocniczą (która ma zbudować xml z tych danych). Potem mając tego xml’a chcę wywołać zewn. web service, odebrać wynik, przetworzyć i wysłać mailem.

Problem dotyczy tylko tego, aby wygodniej budować xml. Mogę to zrobić oczywiście po chamsku w Ruby (i tak na razie robię) ale chciałem jakoś użyć do tego Buildera i RXML, bo wtedy byłoby znacznie ładniej. No i w sumie builder po to jest aby wygodnie budować XML, a nie robić to dookoła - na stringach.

[code]# tu wskakują ajaxem dane z formularza
def form
#… mielę dane
xml = build_xml(dane)
response = wywolaj_soap(xml) # wciągam dane z soap
wyslij_email(response) # wypycham mailem w inne miejsce
end

def build_xml(dane)

tu chcę wykorzystać RXML i wzrócić czysty xml czyli

return render_to_string :layout => false
end[/code]

[quote=jzabiello]Nie robię żadnego render :update bo dla RJS tego nie powinno się robić (tak piszą w książce). Także w form_remote_tag nic nie nadpisuję. Po prostu form_remote_tag wywołuje metodę, która zbiera to co przyszło i wywołuje metodę pomocniczą (która ma zbudować xml z tych danych). Potem mając tego xml’a chcę wywołać zewn. web service, odebrać wynik, przetworzyć i wysłać mailem.

Problem dotyczy tylko tego, aby wygodniej budować xml. Mogę to zrobić oczywiście po chamsku w Ruby (i tak na razie robię) ale chciałem jakoś użyć do tego Buildera i RXML, bo wtedy byłoby znacznie ładniej. No i w sumie builder po to jest aby wygodnie budować XML, a nie robić to dookoła - na stringach.[/quote]
Hmm ale render :update to wlasnie RJS tylko nie w odzielnych szablonach a w kontrolerze.
Wyglada na to, ze problem lezy w tym ze akcja nie wie gdzie i jak ma zwracac swoj wynik.
Sprobuj dodaj do form_remote_tag dodac pole :update jakie kolwiek. albo w akcji zrob render(:nothing => true)
Do konca nie wiem jak wyglada to w Twoim kodzie ale to na 90% jest ten problem.

Pierwsze odpada. To formularz złożony z różnych dynamicznych elementów wzajemnie powiązanych. Poza tym nie chcę robić żadnego update, ale tylko wciągnąć xml’a zbudowanego builderem. Co do drugiego, to po dodaniu

 render_to_string :nothing => true

nic nie jest zwracane. :frowning:

Chyba nie do konca rozumiem co chesz zrobic. Zbudujesz tego XML przez rxml i co chcesz z nim zrobic? wyswietlic, zapisac, przeslac czy ma to byc moze RSS?

Przecież napisałem, co chcę. Chcę wykorzystać ten XML do odpytania zewn. serwisu SOAP.

Tak ale poki co rozumiem, ze problemem jest to, ze do klienta zwracany jest kod JS jako tekst.
odpytasz tego SOAPa (zrobic render_to_string odpowiedni szablon i :type=>:rxml jak dobrze pamietam) i co chcesz zwrocic do klienta?

[quote=Adamh]Tak ale poki co rozumiem, ze problemem jest to, ze do klienta zwracany jest kod JS jako tekst.
odpytasz tego SOAPa (zrobic render_to_string odpowiedni szablon i :type=>:rxml jak dobrze pamietam) i co chcesz zwrocic do klienta?[/quote]
Cały problem wynikał z tego, że render_to_string() zmienia (nie wiem po co) nagłówki. Chodzi o @headers[‘Content-Type’]. Nie powinien w ogóle tu nic dotykać, przecież ta metoda ma zwracać string a nie nagłówki + string. Np. można ją przypisać do zmiennej. I to właśnie potrzebowałem. Jedna akcja odpalała drugą i ta druga miała zbudować xml i zwrócić go jako string. Niestety podczas odpalania render_to_string() uległ zmianie nagłówek i tym samym żaden plik RJS związany z akcją główną nie działał. Gdyby nie FireBug to bym tego chyba nigdy nie wyłapał. Receptą jest poprawienie sposobu działania render_to_string() np. tak:

module ActionController class Base def render_to_string(options = nil, &block) content_type = @headers['Content-Type'] # dodane result = render(options, &block) erase_render_results forget_variables_added_to_assigns reset_variables_added_to_assigns @headers['Content-Type'] = content_type if content_type != @headers['Content-Type'] # dodane result end end end
Zgłosiłem już stosowny ticket z moją poprawką.