旅行的意義

           

          [RoR]Agile Web Development with Rails 3rd depot疑難雜癥

          depot項(xiàng)目任務(wù)E check out一章很長,最后playtime中有兩個(gè)題。
          (1)在checkout.html.erb頁面不應(yīng)該還有 [checkout] 按鈕
          (2)把payment_type字段分離成一個(gè)表。

          第一個(gè)相對(duì)簡單一點(diǎn),最省事兒的辦法是,設(shè)置一個(gè)標(biāo)志字段,然后在layout/store.html.erb中判斷一下。
          第二個(gè)就比較復(fù)雜,
          (1) generate migration, 重建數(shù)據(jù)表,修改數(shù)據(jù)表
          (2) generate model PaymentType ,修改Order,添加一對(duì)一的映射關(guān)系。
          (3) 修改store_controller,在checkout中加入@payment_types的取得方法,將對(duì)應(yīng)的view中select部分的靜態(tài)數(shù)組改成這個(gè)@payment_types。
          (4)因?yàn)檫@個(gè)payment_type比較特殊,在order里頭并不保存type的id,而是保存name(就是縮寫),所以編碼的時(shí)候需要注意字段的對(duì)應(yīng)關(guān)系。不過注意一下的話,問題不大。

          結(jié)果,第二個(gè)跑出來有問題,在checkout頁面輸入訂單信息并選擇支付方式,全通過,則沒問題,數(shù)據(jù)庫里也都正確。但是一旦有任何輸入為空或不合預(yù)期,則報(bào)錯(cuò):

           

          You have a nil object when you didn't expect it!
          You might have expected an instance of Array.
          The error occurred while evaluating nil.map

           

          傻了……
          因?yàn)閷?duì)payment_type的獲取方法也不是很肯定,所以一開始懷疑問題出在表結(jié)構(gòu)映射關(guān)系上,反復(fù)檢驗(yàn)后沒發(fā)現(xiàn)問題。
          然后懷疑頁面?zhèn)鲄栴},參數(shù)傳不到這種rp問題……加之之前有幾處rails版本區(qū)別,覺得對(duì)rails的一些約定還是不太了解。
          然后試著修改頁面,將checkout view的select那一段

          collection_select :pay_type,:name,@pay_types,:name,:display_name,
            options
          ={:prompt=>"Select a payment type"}


          改成

          if @pay_types then
            collection_select :pay_type,:name,@pay_types,:name,:display_name,
            options
          ={:prompt=>"Select a payment type"}
          else
            form.select :pay_type,PaymentTypes::STATIC_TPYES,
             :prompt
          =>"Select a payment type"
          end


           

          頁面倒是不會(huì)出錯(cuò)了,不過心里總留了一個(gè)疙瘩,而且事實(shí)上每次出錯(cuò)后都會(huì)從PaymentTypes::STATIC_TPYES中取支付類型,也不符合playtime的初衷。這說明某些情況下@pay_types的確是nil了,但是反過來,為啥呢?
          忽然一下想起,要是@pay_types為空的話,第一個(gè)去按鈕的任務(wù)也應(yīng)該不成功,檢查了一下,的確如此。

          但checkout頁面確確實(shí)實(shí)的顯示出來了,說明checkout view被調(diào)用了,然而參數(shù)是空的。這是我想到看看checkout之后有些什么操作——
          checkout提交到save_order,成功則重定向到Index,而失敗則render到checkout頁面。


          注意到這里的render。render和redirect_to都會(huì)根據(jù)checkout.html.erb的內(nèi)容進(jìn)行布局,而二者的區(qū)別在于,redirect_to會(huì)重定向到action對(duì)應(yīng)的函數(shù)中重新執(zhí)行,而render則不會(huì)。具體在這里區(qū)別就是render不會(huì)執(zhí)行checkout里關(guān)于獲取
          @pay_type的那一段邏輯,從而導(dǎo)致@pay_type為空,自然呈現(xiàn)出來的html中@pay_type就會(huì)出錯(cuò)。

          在save_order里面加上生成@pay_types的初始化方法,刷新之后問題解決。
          問題應(yīng)該是找到了,但不知道是不是最好的解決辦法。因?yàn)閟ave_order和checkout中存在代碼重復(fù),可以考慮重構(gòu)一下。


           

           

          posted on 2008-11-03 17:04 bacon 閱讀(1415) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 和田市| 台中县| 扬州市| 云梦县| 兴安县| 邯郸县| 黄龙县| 西峡县| 宾川县| 沙田区| 镇康县| 芒康县| 江油市| 比如县| 县级市| 湟中县| 棋牌| 宜宾市| 遂川县| 彰武县| 澄城县| 团风县| 清流县| 临泽县| 沅陵县| 体育| 天峨县| 鄱阳县| 嘉祥县| 天水市| 柳河县| 靖州| 芜湖市| 榆中县| 饶阳县| 西乌珠穆沁旗| 托克托县| 永城市| 浦城县| 三穗县| 巴青县|