Вчера ходих на “Панаир на книгата” в НДК. Имаше няколко фирмени щанда с компютърна литература. След като ги разгледах подробно и не можах нищо да си харесам, реших да питам – “Нямате ли някаква книга за Ruby?”. Оказа се, че нямат. Едната лелка предположи, че на другия щанд може да има. Но там казаха направо, че книга за Ruby на български няма. Този факт не говори добре за българските издатели и книгоразпространители. Почти всяка фирма предлага поне по една книга за LAMP, но когато човек търси нещо малко по-ново и специализирано – нищо не намира. Това ме надъха да драсна няколко реда за AJAX през Ruby on Rails, като използвам partials и Malline.
Описанието на задачата е следното. Имаме някаква страница в която има три div елемента. Два от тях представляват менюта. Искаме в третия да слагаме някакво динамично съдържание, без да презареждаме цялата страницата, като използваме AJAX. Съдържанието на всеки от div елементите се намира в отделен partial. Ето как би изглеждала тази страница на Malline:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
За ляво меню имаме следия partial:
1 2 3 | |
С функцията link_to_remote слагаме връзка към метода menu_entry от същия контролер. При задействане на връзката ще се смени съдържанието на div с идентификатор content. За зареждане на новото съдържание се грижи методът menu_entry. Ето как може да изглежда той:
1 2 3 | |
Не съм много сигурен дали това е най-правилния начин за работа с AJAX през RoR, но на мен ми върши добра работа. Има много интересни неща покрай този код. Най-напред с функцията javascript_include_tag включваме огромната Prototype JavaScript библиотека към нашето приложение. Тя се грижи за всички AJAX неща, но ние не работим директно с нея, а използваме Ruby, като език от по-високо ниво. Функцията render се използва за “включване” на някакво парче (partial) HTML код в страницата. Много е удобна за работа с повтарящи се елементи и работа с обекти. Например можем да подаваме на някакъв partial обект от тип кола, и да използваме този partial навсякъде където се налага да визуализираме “коли”. Друг интересен момент за render е, че тя се използва и в изгледа, и в контролера. Това на мен не ми харесва особено, дори си мислех за някакъв начин да го избегна. Все още не съм достатъчно добър с RoR за да намирам правилното място за дадена функционалност от първия път…