iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 7
0
Modern Web

Ruby礦工的Rails地圖系列 第 7

Top 10 common mistake for junior rails developer (1~5)

十大常見的新手Rails工程師問題
有部分的錯誤,或許非Rails也可能會犯唷!

  1. 拼錯字與命名不一致
  2. 沒有重啟Server或console
  3. 測試效果與修改code的位置不一致
  4. nil method not fount
  5. DB不一致
  6. Ruby&Rails版本衝突
  7. session 毀損
  8. 找不到routes
  9. 圖片無法用get方法上傳
  10. view階段loop不小心印出值

如果分十天介紹,感覺好像會被譴責水分太少
那就分為上下集吧!

拼錯字與命名不一致

這個雖然很蠢,卻很基本
而且不只是rails,每一種程式語言的初學者
都可能會犯上一兩回
最吐血的就是花了半天甚至一天,才發現原來是打錯字

除了拼錯字,還有一種可能的錯誤是命名不一致
例如多一個s或少一個s
新手一開始看著教材或範例程式一行一行練習
很可能在創建資料夾時,不小心把資料夾檔名打錯
或雖然不算拼錯,但卻因為兩處不一致導致找不到對應的檔案或方法

我自己是不太信任打字,
所以通常都是複製貼上,某種程度上也可以稍加避免拼錯的機率

沒有重啟Server或console

改了config資料夾內的檔案需要重啟server才會生效
如果是跑console測試時,例如model也需要先退出再重新載入
才會有最新的變更
不確定為什麼修改沒有生效時,
可以考慮兩者都重啟

測試效果與修改code的位置不一致

這個也是跨不同語言的新手錯誤
甚至老手有時候也會栽跟斗
當修改了半天,卻發現該出現的變化沒有出現
這時可能就要檢查一下
目前修改的地方與試圖秀出效果的頁面是否一致

有非常多種可能會出現這樣的情形
比方說因為權限或判斷而導致修改的程式片段根本沒有執行到;
或是環境不同,比方說修改本地端的程式,卻在看線上測試環境的版本;
或是修改到相似但不同的程式片段,例如修改後台看前台;
或是延續上一點,修改後沒有重啟。
上述的每一點都是真實發生的案例,加起來大約有上百小時在找原因,
可以優先檢查排除。

nil method not fount

這應該是rails專案專有的,而且還頗常見的情況,例如:

model = Model.find(params[:id])
model.do_something

因為各式各樣的原因,可能id並沒有順利傳入
導致model為nil
所以不管nil要做什麼都會找不到方法囉

這邊有兩種處理邏輯,沒有對錯,要視使用情況來判斷哪一種合適
第一種是取用方法前判斷實體存在,例如:
model.do_something if model.present?
如果model不為空的時候才使用它
但這會有一個問題,雖然不會跳錯,
但非預期沒有成功取值,後面該事件沒有順利執行
可能會造成更糟糕的後果!不可不慎

所以第二種處理方式
是在無法順利取到實體時,提出警告或錯誤
算是思慮比較周密的做法,但有時卻顯得畫蛇添足,例如:

model = Model.find(params[:id])
if model.present?
    model.do_something    
else
    redirect_to :back, notice: "找不到該方法"
end

不論哪一種方法
目標是讓專案減少出現非預期的程式錯誤
至少讓錯誤變成可管理的狀態

DB不一致

沒有其他網路語言開發經驗的新手
很容易在一開始把資料庫視為是版本管理的一部分
畢竟migration與schema很容易給人這種錯覺
但事實上資料庫與程式是不同的個體
如果程式需要依賴資料結構與資料內容才能順利運作
那當切換環境時,很容易出現這類型的錯誤

為了解決這樣的問題
通常是寫rake檔來執行某些資料庫異動指令
來解決不同版本間對於資料庫的需求
這樣做的缺點是,除了pull程式之外
還必須要提醒其他工程師必須執行必要的rake指令
但總是比一行一行下rails console去修改資料庫來得更保險
如果是跟migration有關,
rake 本身也可以直接寫在裡面一併執行
這樣也算是成為版本的一部分,畢竟跟新migration一起執行
比較不容易遺漏,以下是新建rake檔的範例

#lib/tasks/branch.rake
namespace :branch do
  desc "branch_name"
  task :branch_name => :environment do
     Model.create(foo: "FOO",bar: "BAR")
  end
end

建立好以後,可以執行rake -T來查詢
例如以上範例指令為rake branch:branch_name
之後就會執行裡面的資料庫異動指令
下面是與migration結合的範例:

def change
    add_column :models, :foo, :integer, default: 1
    Model.find_each do |model|
      if model.is_foo
        model.update_attribute(:foo, model.balabala)
      end
    end
end

但要特別注意,rake db:rollback當然不包含裡面的還原
比較簡單的方法是要還原之前,先把非結構異動註解起來
才不會結外生枝

以上就是今天介紹的五個常見錯誤
篇幅跟內容都還算是有誠意吧?
希望能幫助一些新朋友節省一些寶貴的除錯時間


上一篇
Don't use Magic number in your code
下一篇
Top 10 common mistake for junior rails developer (6~10)
系列文
Ruby礦工的Rails地圖30

1 則留言

0
生蠔
iT邦新手 5 級 ‧ 2016-12-12 23:57:44

你要不要副一下原文出處啊 還是這是你自己寫的!?

bater iT邦新手 5 級‧ 2016-12-17 22:03:53 檢舉

終於可以留言了,這是我自己寫的

生蠔 iT邦新手 5 級‧ 2016-12-17 23:09:17 檢舉

嗯嗯 拍謝拍謝 因為我看到你標題寫英文,很像國外常見的英文標題。
拍謝啦

我要留言

立即登入留言