讓你的Rails應(yīng)用更加健壯的5種姿勢『譯』

原文鏈接: Five Practices for Robust Ruby on Rails Applications
轉(zhuǎn)載請注明出處:http://www.tedyin.me/2016/03/06/five-practices-for-robust-ruby-on-rails-applications/

無論什么時候嫉戚,當(dāng)我發(fā)現(xiàn)項目里面存在 bug 或者數(shù)據(jù)不一致,但卻又很難找到是哪里出了問題時肋乍,我總是會感嘆:“他們(the developer)只需要再多敲幾下鍵盤兵怯,這些事情就不會發(fā)生了∧眨”

Brewhouse的工作中杏愤,我們會應(yīng)用下面5種最佳實踐,讓我們的 Rails 應(yīng)用更加健壯已脓。因為這些方法可以讓代碼在遇到問題時珊楼,可以盡早地、明確地度液、快速地的拋出問題厕宗,告訴我們哪里出錯了。我們可以通過捕捉這些錯誤信息來確保我們所有的數(shù)據(jù)和操作都是正確有效的堕担。

使用 Hash#fetch 方法去處理‘有問題’的 hash 對象

unexpected method 'upcase' for nil… 這樣的錯誤已慢,我們經(jīng)常會遇到。無論什么時候當(dāng)你去遍歷一個hash對象照宝,如果你希望這個hash對象中所有的key都存在蛇受,你最好是使用fetch方法去代替[]方法。fetch()方法在遇到key不存在的情況時會拋出異常厕鹃,因此你就無法再傳入一個有問題的hash對象了兢仰,也就不可能出現(xiàn)一些奇怪的 bug 了乍丈。

使用 case ... else raise 去捕獲異常數(shù)據(jù)

最好是在所有的case條件選擇語句中加入else raise語句,來處理一些你預(yù)想之外的情況把将。當(dāng)你的方法接收到一些你預(yù)想之外的數(shù)據(jù)時轻专,我想你肯定是想知道這些是什么數(shù)據(jù),而不是說忽略這些數(shù)據(jù)察蹲,而讓代碼繼續(xù)執(zhí)行请垛。因此建議使用case ... else raise!

使用 ActiveRecord 的 ‘!’ 方法,讓失敗的操作自己說話

對于每個公司來說洽议,數(shù)據(jù)通常都是非常重要的資產(chǎn)宗收。如果在對數(shù)據(jù)進行持久化或者其他錯作時失敗了,但是這些失敗的操作是悄悄發(fā)生的我們并不知道亚兄,那么這會是一件很危險的事情混稽,將會對我們的數(shù)據(jù)造成嚴(yán)重的危害。因此無論什么時候审胚,當(dāng)你不希望某些操作失敗時你卻不知道的話匈勋,建議是用create!update!destroy!方法膳叨,在操作失敗的時候他們會拋出異常洽洁,來告訴你操作失敗了。這額外的一個字符!將會讓你避免去處理麻煩的數(shù)據(jù)不一致等奇奇怪怪的問題菲嘴。

我們一般都會寫測試代碼饿自,但是我們一定要確保測試代碼在setup時是正確的,而且如果測試在setup時是錯誤的龄坪,那一定要拋出異常讓我們知道璃俗,因為沒有比使用一個錯誤的setup跑出正確的測試結(jié)果更讓人蛋疼的事情了,這樣的代碼一旦上線悉默,那后果你懂的...

除了上面說的,在執(zhí)行的多個SQL調(diào)用時苟穆,使用事務(wù)將那些調(diào)用包起來處理抄课,可以避免你的操作導(dǎo)致數(shù)據(jù)處于不一致的狀態(tài),或者是半吊子的狀態(tài)雳旅。

譯者注:確實如此跟磨,曾經(jīng)有一次我在處理數(shù)據(jù)的時候,就是沒有注意這些導(dǎo)致造成了數(shù)據(jù)破壞攒盈,幸虧當(dāng)時的數(shù)據(jù)有備份抵拘,才沒有導(dǎo)致大的問題。

使用 ActiveRecord 的 validate 相關(guān)方法來動態(tài)校驗?zāi)愕臄?shù)據(jù)

使用 ActiveRecord 的 validate 相關(guān)的方法型豁,并且使用帶有!的方法來做校驗方法僵蛛,將會是一個很好的方式去確保你在持久化數(shù)據(jù)時不會出錯尚蝌。舉個例子:

class Post < ActiveRecord::Model
  validates :author, :blog, presence: true
  validates :published_by, presence: true, if: :published?
  validates :comment_count, numericality: { greater_or_equal_to: 0 }
  # ...
end

使用數(shù)據(jù)庫約束來確保你的數(shù)據(jù)的一致性

你的數(shù)據(jù)庫是你最好的朋友,他能夠幫你保存你的數(shù)據(jù)充尉,并且確保你的數(shù)據(jù)不出現(xiàn)重復(fù)和“孤兒記錄”的問題飘言。

一般情況下,你應(yīng)該為你的數(shù)據(jù)庫中的大多數(shù)字段設(shè)置他們默認(rèn)不為空驼侠,也就是null: false姿鸿。
你是否知道 Rails 中的 has_one 約束,在數(shù)據(jù)的創(chuàng)建時不會起到唯一性約束作用呢倒源?

class Account
  has_one :account_settings
end

account = Account.create!
account.create_account_settings!
account.create_account_settings!
account.create_account_settings!

account.account_settings
 # => one of the three account settings you've created... -_-

如果想讓你的數(shù)據(jù)不出現(xiàn)重復(fù)苛预,最好的方式是給你的數(shù)據(jù)添加唯一索引。

add_index :account_settings, :account_id, unique: true

這樣做之后笋熬,如果你嘗試去創(chuàng)建重復(fù)的記錄時热某,數(shù)據(jù)庫就會拋出異常,去阻止你創(chuàng)建重復(fù)數(shù)據(jù)突诬。

我們每一個人都不會想存儲一些“孤兒記錄”在數(shù)據(jù)庫中苫拍。但是如何去解決這些“孤兒記錄”呢?使用外鍵是可以很好的幫你解決這個問題旺隙,在這里我推薦大家使用schema_auto_foreign_keys這個 gem 去為你的相關(guān)的表自動添加外鍵約束绒极。

總結(jié)

多寫幾個字母就可以幫我們避免處理數(shù)據(jù)不一致的麻煩問題,也會大大減少我們代碼的 bug 率蔬捷,提高我們的工作效率垄提。記住,使用!周拐,raise铡俐,validate數(shù)據(jù)庫約束去強化你的代碼,使你的代碼更加強壯妥粟。你的同事會感謝你审丘,說不定以后當(dāng)你在次翻看你的代碼的時,你會覺得當(dāng)時做的真好勾给,讓你在后來避免了很多不必要的麻煩滩报。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市播急,隨后出現(xiàn)的幾起案子脓钾,更是在濱河造成了極大的恐慌,老刑警劉巖桩警,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可训,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機握截,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門飞崖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人川蒙,你說我怎么就攤上這事蚜厉。” “怎么了畜眨?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵昼牛,是天一觀的道長。 經(jīng)常有香客問我康聂,道長贰健,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任恬汁,我火速辦了婚禮伶椿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氓侧。我一直安慰自己脊另,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布约巷。 她就那樣靜靜地躺著偎痛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪独郎。 梳的紋絲不亂的頭發(fā)上踩麦,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音氓癌,去河邊找鬼谓谦。 笑死,一個胖子當(dāng)著我的面吹牛贪婉,可吹牛的內(nèi)容都是我干的反粥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疲迂,長吁一口氣:“原來是場噩夢啊……” “哼星压!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鬼譬,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逊脯,沒想到半個月后优质,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年巩螃,在試婚紗的時候發(fā)現(xiàn)自己被綠了演怎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡避乏,死狀恐怖爷耀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拍皮,我是刑警寧澤歹叮,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站铆帽,受9級特大地震影響咆耿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爹橱,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一萨螺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愧驱,春花似錦慰技、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惫确,卻和暖如春手报,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背改化。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工掩蛤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陈肛。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓揍鸟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親句旱。 傳聞我的和親對象是個殘疾皇子阳藻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容