<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    旅行的意義

     

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

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

    第一個(gè)相對(duì)簡(jiǎn)單一點(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(就是縮寫(xiě)),所以編碼的時(shí)候需要注意字段的對(duì)應(yīng)關(guān)系。不過(guò)注意一下的話(huà),問(wèn)題不大。

    結(jié)果,第二個(gè)跑出來(lái)有問(wèn)題,在checkout頁(yè)面輸入訂單信息并選擇支付方式,全通過(guò),則沒(méi)問(wèn)題,數(shù)據(jù)庫(kù)里也都正確。但是一旦有任何輸入為空或不合預(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的獲取方法也不是很肯定,所以一開(kāi)始懷疑問(wèn)題出在表結(jié)構(gòu)映射關(guān)系上,反復(fù)檢驗(yàn)后沒(méi)發(fā)現(xiàn)問(wèn)題。
    然后懷疑頁(yè)面?zhèn)鲄?wèn)題,參數(shù)傳不到這種rp問(wèn)題……加之之前有幾處rails版本區(qū)別,覺(jué)得對(duì)rails的一些約定還是不太了解。
    然后試著修改頁(yè)面,將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


     

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

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


    注意到這里的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)出來(lái)的html中@pay_type就會(huì)出錯(cuò)。

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


     

     

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


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


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

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(1)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲欧洲日本天天堂在线观看| 国产免费AV片无码永久免费| 亚洲中文字幕久久精品无码喷水| 蜜芽亚洲av无码一区二区三区| 日韩免费a级在线观看| 亚洲精品无码av中文字幕| 在线观看免费人成视频色9| 九一在线完整视频免费观看| 成人免费乱码大片A毛片| 亚洲一区二区三区免费在线观看| 久久久亚洲AV波多野结衣| 91久久青青草原线免费| 亚洲最大在线视频| 国产成人免费高清激情视频| 亚洲日本VA午夜在线电影| 四虎国产精品免费久久影院| 黄色a级免费网站| 亚洲婷婷五月综合狠狠爱| 玖玖在线免费视频| 亚洲国产av高清无码| 精品一区二区三区无码免费直播| 亚洲成av人在片观看| 国产三级在线免费观看| 亚洲AV成人片色在线观看| 成年黄网站色大免费全看| 亚洲日本天堂在线| 亚洲av无码国产精品色在线看不卡 | 国产成人精品日本亚洲网站| 国产成人免费视频| 亚洲日韩国产精品乱-久| 亚洲中久无码不卡永久在线观看| 国产午夜精品免费一区二区三区| 亚洲成a人片77777群色| 免费永久看黄在线观看app| 大地资源网高清在线观看免费| 亚洲成年人电影在线观看| 四虎影视在线永久免费观看| 日韩人妻一区二区三区免费| 久久久久亚洲国产| 亚洲色WWW成人永久网址| 97无码免费人妻超级碰碰夜夜|