yashke.com

Janu @ July 21st, 2006

Dodaj do ulubionych

Robota wre, jesteśmy w trakcie opracowywania podstawowych funkcjonalności serwisu oraz kodowania tychże. Jednym z ficzerów jest dodawanie do ulubionych z jednoczesnym tagowaniem. Zasadniczo rozwiązanie składa się z linku “dodaj do ulubionych”, który kliknięty rozwija formularz, do którego można wpisać jakieś tagi - w tym wybrać tagi proponowane przez stronę. Po kliknięciu na przycisk (submit) “dodaj” formularz bez przeładowania przesyła tagi do odpowiedniego kontrolera i zmienia link na “usuń z ulubionych”. Oczywiście usunięcie z ulubionych również odbywa się przy użyciu AJAXa, więc można sobie na zmianę dodawać i usuwać z ulubionych.
Dodaj do ulubionych
Rozwiązanie tego problemu w Railsach jest dosyć proste. Tworzymy odpowiednie akcje w jakimś kontrolerze, które odpowiedzialne będą za dodawanie i usuwanie z ulubionych, wyświetlają OK (w przypadku przesyłania AJAXem) albo przekierowują na poprzednią stronę (gdy przesyłamy z przeładowaniem przeglądarki) - RoR ma przy tym przyjemne rozwiązanie w postaci funkcji redirect_to, której wystarczy zaaplikować symbol :back - warto przy tym pamiętać, że framework czerpie informację o ostatniej stronie nie z sesji (co byłoby rozwiązaniem najbardziej funkcjonalnym), a z nagłówka Referer (przynajmniej wywnioskowałem z jednego komunikatu o błędzie, który raz mi się przypadkowo pojawił).

W sekcji View odpowiedniej akcji powinniśmy utworzyć odpowiednie linki do poszczególnych zadań - wiadomym przy tym jest, że “dodaj do ulubionych” i “usuń z ulubionych” pojawiają się naprzemiennie. Linkowi “dodaj do ulubionych” przypisujemy efekt script.aculo.us o nazwie blind, rozwijający ukryty formularz (w przypadku wyłączonego JS formularz byłby po prostu widoczny, a link “dodaj…” nic by nie robił). Można przy tym skorzystać z helpera: link_to_function, ja jednak uznałem za wpisanie linku z poziomu HTML’a. W przypadku usuwania z ulubionych link należy wykierować zarówno w funkcję, jak i do odpowiedniej akcji kontrolera, inaczej rozwiązanie padnie na przeglądarkach bez JS.

Sam formularz z tagami również wysyłamy przy pomocy AJAXa, można przy tym skorzystać z gotowca form_remote_tag, którego oczywiście nie stosuję, bo nie potrafię w nim przypisać odpowiedniego URLa do Ajax.Request. Warto przy tym wspomnieć o bajerkach Prototype’owych, które właściwie odwalają za nas większość roboty - Form.serialize “ładuje” wszystkie dane z formularza do ciągu kodowanego tak jak adresy URL, przez co możemy z łatwością przesyłać dane metodą POST; onSuccess, onFailure umożliwiają przypisanie odpowiednich funkcji w razie powodzenia czy niepowodzenia. W razie powodzenia przy wysyłaniu formularza zwijamy tenże i zmieniamy link na usuń z ulubionych. Natomiast gdy akcja się nie powiedzie to wysyłany jest alert, że coś nie gra. Gdy usuwamy z ulubionych to po prostu zmienia się link, bo formularz do tagowania cały czas jest w odpowiednim miejscu, tylko ukryty.

Ostatnim zadaniem, które jeszcze czeka na realizację jest zgadywanie co użytkownik chce w formularzu wpisać (autocomplete, prawdopodobnie rozwiązanie ułatwi script.aculo.us) oraz dodawanie tagów z listy proponowanych. Lista proponowanych tagów jest tworzona na podstawie tagów, które już zostały już przypisane do tekstu i tagów, które użytkownik dodał do innych tekstów.

Tagi:

Skomentuj ten wpis!