freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

rails敏捷開(kāi)發(fā)2(編輯修改稿)

2025-06-11 23:26 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 果。(更多提示請(qǐng)看。)在本章中,我們將看到如何:● 如何通過(guò)外鍵將數(shù)據(jù)庫(kù)表關(guān)聯(lián)起來(lái) ● 使用belongs_to和has_many● 根據(jù)模型對(duì)象創(chuàng)建表單(form_for) ● 連接表單、模型與視圖第10章 任務(wù)E:付賬Task E: Check Out! 我們先來(lái)盤(pán)點(diǎn)一下成果。到目前為止,我們已經(jīng)實(shí)現(xiàn)了一個(gè)基本的貨品維護(hù)系統(tǒng)、一個(gè)貨品分類(lèi)列表,以及一個(gè)還算漂亮的購(gòu)物車(chē)。所以,現(xiàn)在我們要讓買(mǎi)主能夠?qū)嶋H購(gòu)買(mǎi)購(gòu)物車(chē)中的貨品,須要實(shí)現(xiàn)結(jié)賬的功能。我們不打算一步到位。就目前而言,我們只須獲取買(mǎi)主的詳細(xì)聯(lián)系信息和付款方式,并用這些信息在數(shù)據(jù)庫(kù)里構(gòu)造一份訂單即可。在此過(guò)程中,我們會(huì)了解更多關(guān)于模型、輸入驗(yàn)證、表單處理和組件的知識(shí)。 迭代E1:收集訂單信息Iteration El:Capturing an Order 訂單(order)是由一組訂單項(xiàng)(line item)、外加購(gòu)買(mǎi)交易的詳細(xì)信息構(gòu)成的。訂單項(xiàng)其實(shí)已經(jīng)初具雛形了,那就是購(gòu)物車(chē)中的物品。不過(guò)現(xiàn)在還沒(méi)有一張數(shù)據(jù)庫(kù)表來(lái)存儲(chǔ)訂單項(xiàng),同樣也沒(méi)有保存訂單信息的表。不過(guò),根據(jù)第57頁(yè)的草圖,再加上跟客戶(hù)的簡(jiǎn)短討論,我們現(xiàn)在就可以動(dòng)手生成Rails模型,并用遷移任務(wù)來(lái)創(chuàng)建對(duì)應(yīng)的表。首先,我們要?jiǎng)?chuàng)建兩個(gè)模型類(lèi)。depot ruby script/generate scaffold order name:string address:text \ string pay_type:string...depot ruby script/generate scaffold line_item product_id:integer \ order_id:integer quantity:integer total_price:decimal...然后,修改創(chuàng)建orders表的遷移任務(wù),先給pay_type字段加上長(zhǎng)度限定:Download depot_p/db/migrate/class CreateOrders ActiveRecord::Migration def create_table :orders do |t| :name :address :→ :pay_type, :limit = 10 end end def drop_table :orders endend接著修改創(chuàng)建line_items表的遷移任務(wù):Download depot_p/db/migrate/class CreateLineItems ActiveRecord::Migration def create_table :line_items do |t|→ :product_id, :null = false, :options =→ CONSTRAINT fk_line_item_products REFERENCES products(id)→ :order_id, :null = false, :options =→ CONSTRAINT fk_line_item_orders REFERENCES orders(id)→ :quantity, :null = false→ :total_price, :null = false, :precision = 8, :scale = 2 end end def drop_table :line_items endendJoe 問(wèn)……信用卡處理在哪兒到現(xiàn)在,我們這個(gè)教學(xué)用的應(yīng)用程序與真實(shí)世界出現(xiàn)了一點(diǎn)差異。在真實(shí)世界里,我們很可能需要應(yīng)用程序處理整個(gè)支付業(yè)務(wù),包括信用卡處理(可能使用Payment模塊*或是Tobia L252。tke的ActiveMerchant類(lèi)*)。但是后端支付流程的整合涉及大量的規(guī)約資料,會(huì)將讀者的注意力從Rails這里移開(kāi),所以我們決定不考慮這方面的細(xì)節(jié)。* //* //請(qǐng)注意,這張表包含兩個(gè)外鍵。這是因?yàn)閘ine_items表中的每條記錄都需要同時(shí)與“訂單”和“貨品”關(guān)聯(lián)。遺憾的是,這里有幾個(gè)問(wèn)題,首先, Rails遷移任務(wù)并未提供一種獨(dú)立于數(shù)據(jù)庫(kù)的方式指定外鍵約束,所以我們只好通過(guò)附加數(shù)據(jù)庫(kù)(在這里就是SQLite3)原生的DDL語(yǔ)句來(lái)建立外鍵;其次,就像這篇文章所說(shuō)的那樣,SQLite3 ,而不會(huì)真正執(zhí)行外鍵約束;最后,這些自定義的約束不會(huì)被儲(chǔ)存在db/,因此也不會(huì)被復(fù)制到測(cè)試數(shù)據(jù)庫(kù)。 很多Rails開(kāi)發(fā)者壓根兒就不去費(fèi)心指定數(shù)據(jù)庫(kù)層面的約束(例如外鍵),完全靠應(yīng)用代碼來(lái)保證正確。這可能也是Rails遷移任務(wù)不支持約束的原因之一。不過(guò),如果數(shù)據(jù)完整性很重要的話(huà),很多人(包括Dave和Sam)仍然認(rèn)為:花一點(diǎn)小功夫多做一次檢查,可以節(jié)省徹夜在生產(chǎn)環(huán)境下調(diào)試的大把時(shí)間。如果你對(duì)此有興趣,第286頁(yè)還有相關(guān)內(nèi)容可以參考。我們已經(jīng)寫(xiě)好了兩個(gè)遷移任務(wù),現(xiàn)在就可以實(shí)施它們了。depot rake db:migrate== 20080601000005 CreateOrders: migrating ===================================== create_table(:orders) == 20080601000005 CreateOrders: migrated () ============================== 20080601000006 CreateLineItems: migrating ================================== create_table(:line_items) == 20080601000006 CreateLineItems: migrated () =========================由于schema_migrations表中沒(méi)有這兩個(gè)遷移任務(wù)的記錄,所以運(yùn)行db:migrate任務(wù)會(huì)實(shí)施這兩個(gè)最新的遷移任務(wù)。當(dāng)然我們也可以逐一創(chuàng)建遷移任務(wù),然后再逐一實(shí)施它們。模型之間的關(guān)系Relationships between Models現(xiàn)在,數(shù)據(jù)庫(kù)已經(jīng)知道訂單、訂單項(xiàng)與貨品之間的關(guān)系了,但Rails應(yīng)用還不知道。所以,我們還需要在模型類(lèi)中增加一些聲明,指定它們之間的關(guān)系。首先,(位于app/models目錄下),在其中調(diào)用has_many()方法。class Order ActiveRecord::Base has_many :line_itemsendhas_many指令看來(lái)一目了然:一個(gè)訂單(可能)有多個(gè)訂單項(xiàng)與之關(guān)聯(lián)。這些訂單項(xiàng)之所以被關(guān)聯(lián)到這個(gè)訂單,是因?yàn)樗鼈円昧嗽撚唵蔚膇d。此外,還應(yīng)該在Product模型類(lèi)中加上has_many聲明:如果有很多訂單的話(huà),每種貨品都可能有多個(gè)訂單項(xiàng)與之關(guān)聯(lián)。class Product ActiveRecord::Base has_many :line_items ......end下面我們就要指定反向的關(guān)聯(lián):從訂單項(xiàng)到訂單和貨品的關(guān)聯(lián)。為此,()聲明。class LineItem ActiveRecord::Base belongs_to :order belongs_to :productendbelongs_to聲明告訴Rails:line_items表中存放的是orders表和products表中記錄的子記錄;如果沒(méi)有對(duì)應(yīng)的訂單和貨品存在,則訂單項(xiàng)不能獨(dú)立存在。有一種簡(jiǎn)單的辦法可以幫你記住應(yīng)該在哪里做belongs_to聲明:如果一張表包含外鍵,那么它對(duì)應(yīng)的模型類(lèi)就應(yīng)該針對(duì)每個(gè)外鍵做belongs_to聲明。這些聲明到底管什么用?簡(jiǎn)單說(shuō)來(lái),它們會(huì)給模型對(duì)象加上彼此導(dǎo)航的能力。由于在LineItem模型中添加了belongs_to聲明,現(xiàn)在我們就可以直接得到與之對(duì)應(yīng)的Order對(duì)象了。li = (...)puts This line item was bought by {}另一方面,由于Order類(lèi)有指向LineItem的has_many聲明,我們也可以從Order對(duì)象直接引用與之關(guān)聯(lián)的LineItem對(duì)象——它們都在一個(gè)集合中。order = (...)puts This order has {} line items在第324頁(yè),我們還會(huì)詳細(xì)介紹模型對(duì)象之間的關(guān)聯(lián)。創(chuàng)建表單搜集訂單信息Creating the Order Capture Form現(xiàn)在數(shù)據(jù)庫(kù)表和模型類(lèi)都已經(jīng)到位,我們可以開(kāi)始處理付賬的流程了。首先,我們需要在購(gòu)物車(chē)?yán)锛由弦粋€(gè)Checkout按鈕,并使其連接到store控制器的checkout方法。depot_p/app/views/store/div class=carttitle Your Cart/divtable %= render(:partial = cart_item , :collection = ) % tr class=totalline td colspan=2 Total/td td class=totalcell %= format_price() %/td /tr/table→ %= button_to Checkout , :action = 39。checkout39。 %%= button_to Empty cart , :action = :empty_cart %我們希望checkout這個(gè)action能向用戶(hù)呈現(xiàn)一張表單,提示用戶(hù)在其中輸入將要存入orders表的相關(guān)信息:姓名、住址、電子信箱以及付款方式。也就是說(shuō),我們要在Rails模板中包含一個(gè)表單,表單中的輸入字段會(huì)關(guān)聯(lián)到Rails模型對(duì)象的對(duì)應(yīng)屬性,因此我們需要首先在checkout方法中創(chuàng)建一個(gè)空的模型對(duì)象,這樣表單中的信息才有地方可以去。 同樣,如果你一直緊跟我們的步伐,請(qǐng)記得要把a(bǔ)ction方法放在private聲明的前面。 (我們還必須找出當(dāng)前的購(gòu)物車(chē),因?yàn)椴季帜0逍枰@示它。每個(gè)action開(kāi)頭處都要去查找購(gòu)物車(chē),這已經(jīng)開(kāi)始顯得有點(diǎn)乏味了,稍后我們會(huì)看到如何消除這些重復(fù)代碼。)depot_p/app/controllers/def checkout @cart = find_cart if @? redirect_to_index(Your cart is empty ) else @order = endend請(qǐng)注意,我們?nèi)绾螜z查確保購(gòu)物車(chē)中是有東西的。這是為了避免顧客直接進(jìn)入付賬環(huán)節(jié)而生成空訂單?,F(xiàn)在來(lái)看看模板部分。為了搜集用戶(hù)信息,我們將要使用表單。這里的關(guān)鍵在于:在展示頁(yè)面時(shí)要把初始值填入對(duì)應(yīng)的表單字段;在用戶(hù)點(diǎn)擊“提交”按鈕之后又要把這些值取回到應(yīng)用程序中。在控制器中,我們將@order實(shí)例變量的值設(shè)為一個(gè)新建的Order模型對(duì)象。之所以這樣做,是因?yàn)橐晥D要根據(jù)模型對(duì)象中的初始值生成表單。乍看上去這沒(méi)有什么特別的價(jià)值——這個(gè)新建的模型對(duì)象中所有的字段都還沒(méi)有值,所以表單也是空空如也。但是請(qǐng)想想別的情況:也許我們需要編輯一個(gè)現(xiàn)有的模型對(duì)象;或者用戶(hù)可能已經(jīng)嘗試過(guò)輸入訂單信息,但輸入的數(shù)據(jù)沒(méi)有通過(guò)校驗(yàn)。此時(shí)我們就希望模型對(duì)象中現(xiàn)存的數(shù)據(jù)能夠填入表單展示給用戶(hù)。所以,在這個(gè)階段傳入一個(gè)空的模型對(duì)象就可以讓所有這些情況統(tǒng)一起來(lái)——視圖可以始終認(rèn)為有一個(gè)可用的模型對(duì)象。隨后,當(dāng)用戶(hù)點(diǎn)擊“提交”按鈕時(shí),我們希望在控制器中將來(lái)自表單的新數(shù)據(jù)取回到模型對(duì)象中。幸運(yùn)的是,Rails使這一任務(wù)變得易如反掌:它提供了一組用于處理表單的輔助方法,這些輔助方法會(huì)與控制器和模型對(duì)象交互,實(shí)現(xiàn)了完整的表單處理功能。在寫(xiě)出最終版本的表單之前,我們先來(lái)看一個(gè)簡(jiǎn)單的例子:% form_for :order, :url = { :action = :save_order } do |form| % p label for=order_name Name:/label %= :name, :size = 40 % /p% end %這段代碼有兩處有趣的地方。首先,第1行的form_for輔助方法搭建了一個(gè)標(biāo)準(zhǔn)的HTML表單。但它的工作還不僅如此,傳入的第一個(gè)參數(shù):order告訴該方法:它正在處理的是來(lái)自order實(shí)例變量的對(duì)象。輔助方法會(huì)根據(jù)這一信息給字段命名,并安排如何將字段的輸入值傳回給控制器。:url參數(shù)會(huì)告訴輔助方法,當(dāng)用戶(hù)點(diǎn)擊“提交”按鈕時(shí)應(yīng)該做何操作。在這里,我們會(huì)生成一個(gè)HTTP POST請(qǐng)求,并把請(qǐng)求發(fā)送給控制器中的save_order方法??梢钥吹?,form_for實(shí)際上是搭建了一個(gè)Ruby的代碼塊環(huán)境(這個(gè)代碼塊在第6行結(jié)束)。在代碼塊內(nèi)部,你可以放入普通的模板內(nèi)容(例如p標(biāo)記),同時(shí)也可以使用代碼塊的參數(shù)(也就是這里的form變量)來(lái)引用表單上下文環(huán)境。在第4行,我們就用了這個(gè)上下文環(huán)境來(lái)向表單中添加文本字段。由于這個(gè)文本字段是在form_for的上下文環(huán)境中構(gòu)造出來(lái)的,因此它就自動(dòng)地與@order對(duì)象中的數(shù)據(jù)建立起關(guān)聯(lián)了。
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1