資源描述:
《rails敏捷開發(fā)《2》》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、9.2迭代D2:創(chuàng)建基于Ajax的購物車IterationD2:CreatinganAjax-BasedCartAjax允許我們通過編寫在瀏覽器中運(yùn)行的代碼,來與服務(wù)器端的應(yīng)用程序交互。在這里,我們希望讓AddtoCart按鈕在后臺調(diào)用服務(wù)器端的add_to_card方法,隨后服務(wù)器把關(guān)于購物車的HTML發(fā)回瀏覽器,我們只要把服務(wù)器更新的HTML片段替換到邊框里就行了。要實(shí)現(xiàn)這種效果,通常的做法是首先編寫在瀏覽器中運(yùn)行的JavaScript代碼,然后編寫服務(wù)器端代碼與JavaScript交互(可能是通過JSON之類的技術(shù))。好消息是,只要使用Rails,這些東西都將被隱藏起來:我們使用R
2、uby(再借助一些Rails輔助方法)就可以完成所有功能。向應(yīng)用程序中引入Ajax的技巧在于“小步前進(jìn)”,所以我們先從最基本的開始:修改貨品列表頁,讓它向服務(wù)器端應(yīng)用程序發(fā)起Ajax請求;應(yīng)用程序則應(yīng)答一段HTML代碼,其中展示了最新的購物車。在索引頁上,目前我們是用button_to()來創(chuàng)建“AddtoCart”鏈接的。揭開神秘的面紗,button_to()其實(shí)就生成了HTML的
這是一個(gè)標(biāo)準(zhǔn)的HTML表單,所以,當(dāng)用戶點(diǎn)擊提交按鈕時(shí),就會生成一個(gè)POST請求。我們不希望這樣,而是希望它發(fā)送一個(gè)Ajax請求。為此,必須更直接地編寫表單代碼——可以使用form_remote_tag這個(gè)Rails輔助方法?!癴orm_..._tag”這樣的名字代表它會生成HTML表單,“remote”則說明它會發(fā)起Ajax遠(yuǎn)程調(diào)用?,F(xiàn)在,打開app/views/store目錄下的index.htm
4、l.erb文件,將button_to()調(diào)用替換為下列代碼:depot_l/app/views/store/index.html.erb<%form_remote_tag:url=>{:action=>'add_to_cart',:id=>product}do%><%=submit_tag"AddtoCart"%><%end%>用:url參數(shù),你就可以告訴form_remote_tag()應(yīng)該如何調(diào)用服務(wù)器端的應(yīng)用程序。該參數(shù)接收一個(gè)hash,其中的值就跟傳遞給button_to()方法的參數(shù)一樣。在表單內(nèi)部(也就是do和end之間的代碼塊中),我們編寫了一個(gè)簡單的提交按鈕。在用戶看來,
5、這個(gè)頁面就跟以前一模一樣。雖然現(xiàn)在處理的是視圖,但我們還需要對應(yīng)用程序做些調(diào)整,讓它把Rails需要用到的JavaScript庫發(fā)送到用戶的瀏覽器上。在第24章“Web2.0”(第521頁)中,我們還會詳細(xì)討論這個(gè)話題;現(xiàn)在,我們只需在store布局的
部分里調(diào)用javascript_include_tag方法即可。depot_l/app/views/layouts/store.html.erb
PragprogBooksOnlineStore<%=stylesheet_link_tag"depot",:media=>"all
6、"%>→<%=javascript_include_tag:defaults%>到目前為止,瀏覽器已經(jīng)能夠向我們的應(yīng)用程序發(fā)送Ajax請求,下一步就是讓應(yīng)用程序做出應(yīng)答。我們打算創(chuàng)建一段HTML代碼來代表購物車,然后讓瀏覽器把這段HTM插入當(dāng)前頁面的DOM文檔對象模型(DocumentObjectModel)。這是文檔結(jié)構(gòu)和內(nèi)容在瀏覽器中的內(nèi)部表示,我們據(jù)此來改變顯示給用戶的東西。,替換掉當(dāng)前顯示的購物車。為此,我們要做的第一個(gè)修改就是不再讓add_to_cart重定向到首頁。(我們知道,我們剛剛才加上這個(gè)功能,現(xiàn)在又要把它拿掉了……我們很敏捷,對吧?)我們調(diào)用respon
7、d_to()方法并告訴它我們要響應(yīng)的是.js格式文件這條語句乍看起來有些奇怪,其實(shí)就是一個(gè)使用代碼塊作為參數(shù)的方法調(diào)用。代碼塊在第A.9節(jié)“代碼塊與迭代器”中有介紹。在第12.1節(jié)“分別應(yīng)答”中有更詳細(xì)的描述。。Downloaddepot_l/app/controllers/store_controller.rbdefadd_to_cartproduct=Product.find(params[:id])@cart=find_car