十大常見的新手Rails工程師問題
有部分的錯誤,或許非Rails也可能會犯唷!
如果分十天介紹,感覺好像會被譴責水分太少
那就分為上下集吧!
這個雖然很蠢,卻很基本
而且不只是rails,每一種程式語言的初學者
都可能會犯上一兩回
最吐血的就是花了半天甚至一天,才發現原來是打錯字
除了拼錯字,還有一種可能的錯誤是命名不一致
例如多一個s或少一個s
新手一開始看著教材或範例程式一行一行練習
很可能在創建資料夾時,不小心把資料夾檔名打錯
或雖然不算拼錯,但卻因為兩處不一致導致找不到對應的檔案或方法
我自己是不太信任打字,
所以通常都是複製貼上,某種程度上也可以稍加避免拼錯的機率
改了config資料夾內的檔案需要重啟server才會生效
如果是跑console測試時,例如model也需要先退出再重新載入
才會有最新的變更
不確定為什麼修改沒有生效時,
可以考慮兩者都重啟
這個也是跨不同語言的新手錯誤
甚至老手有時候也會栽跟斗
當修改了半天,卻發現該出現的變化沒有出現
這時可能就要檢查一下
目前修改的地方與試圖秀出效果的頁面是否一致
有非常多種可能會出現這樣的情形
比方說因為權限或判斷而導致修改的程式片段根本沒有執行到;
或是環境不同,比方說修改本地端的程式,卻在看線上測試環境的版本;
或是修改到相似但不同的程式片段,例如修改後台看前台;
或是延續上一點,修改後沒有重啟。
上述的每一點都是真實發生的案例,加起來大約有上百小時在找原因,
可以優先檢查排除。
這應該是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
不論哪一種方法
目標是讓專案減少出現非預期的程式錯誤
至少讓錯誤變成可管理的狀態
沒有其他網路語言開發經驗的新手
很容易在一開始把資料庫視為是版本管理的一部分
畢竟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
當然不包含裡面的還原
比較簡單的方法是要還原之前,先把非結構異動註解起來
才不會結外生枝
以上就是今天介紹的五個常見錯誤
篇幅跟內容都還算是有誠意吧?
希望能幫助一些新朋友節省一些寶貴的除錯時間
你要不要副一下原文出處啊 還是這是你自己寫的!?
終於可以留言了,這是我自己寫的
嗯嗯 拍謝拍謝 因為我看到你標題寫英文,很像國外常見的英文標題。
拍謝啦