<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項目任務E check out一章很長,最后playtime中有兩個題。
    (1)在checkout.html.erb頁面不應該還有 [checkout] 按鈕
    (2)把payment_type字段分離成一個表。

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

    結果,第二個跑出來有問題,在checkout頁面輸入訂單信息并選擇支付方式,全通過,則沒問題,數據庫里也都正確。但是一旦有任何輸入為空或不合預期,則報錯:

     

    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

     

    傻了……
    因為對payment_type的獲取方法也不是很肯定,所以一開始懷疑問題出在表結構映射關系上,反復檢驗后沒發現問題。
    然后懷疑頁面傳參問題,參數傳不到這種rp問題……加之之前有幾處rails版本區別,覺得對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


     

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

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


    注意到這里的render。render和redirect_to都會根據checkout.html.erb的內容進行布局,而二者的區別在于,redirect_to會重定向到action對應的函數中重新執行,而render則不會。具體在這里區別就是render不會執行checkout里關于獲取
    @pay_type的那一段邏輯,從而導致@pay_type為空,自然呈現出來的html中@pay_type就會出錯。

    在save_order里面加上生成@pay_types的初始化方法,刷新之后問題解決。
    問題應該是找到了,但不知道是不是最好的解決辦法。因為save_order和checkout中存在代碼重復,可以考慮重構一下。


     

     

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


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久久综合亚洲色一区二区三区| 亚洲欧洲国产成人综合在线观看| 亚洲人成电影亚洲人成9999网 | 最近中文字幕免费mv在线视频| 久久亚洲精品中文字幕三区| 日韩精品无码免费专区午夜 | 成年女人午夜毛片免费视频| 亚洲欧美日韩一区二区三区| 在线精品免费视频| 国产精品亚洲五月天高清| 免费a级毛片在线观看| 人人爽人人爽人人片av免费| 亚洲精品午夜无码电影网| 久久99精品免费视频| 亚洲国产精品一区二区久| 国外成人免费高清激情视频| 全黄A免费一级毛片| 国产亚洲精品a在线无码| 91高清免费国产自产拍2021| 亚洲精品123区在线观看| 全部免费毛片在线| a毛片免费全部在线播放**| 噜噜噜亚洲色成人网站∨ | 免费少妇a级毛片| 免费a级毛片无码a∨免费软件| 亚洲人成网站影音先锋播放| 毛片a级毛片免费播放下载| 日本一区二区三区免费高清在线| 亚洲人成网站在线观看播放| 亚洲黄色免费网址| 亚洲1区2区3区精华液| 亚洲精品国产精品乱码不99| 免费精品国产自产拍在| 老司机午夜性生免费福利| 亚洲国产精品高清久久久| 成年轻人网站色免费看 | 91老湿机福利免费体验| 春暖花开亚洲性无区一区二区 | 亚洲香蕉在线观看| 中文字幕一精品亚洲无线一区| 91香蕉成人免费网站|