你可能不知道的RoR 5點技巧

原文:5 Ruby on Rails Tips You Probably Don’t Know
作者:Igor Petrov
翻譯:不二
譯者注:Ruby語言以其靈活性爲人所稱道,而Ruby on Rails使用了該語言的靈活性,本文作者列舉了RoR五點不爲人知的使用技巧。

從開始使用Ruby on Rails到現在,幾年過去了,我一直沒有停止在Ruby的世界中探索。Ruby總能爲開發者帶來快樂,這些樂趣來源於從中尋求的一些新東西。

這篇文章將分享我近期的一些新發現,包括一些很少使用的方法,多數”語法糖果”,它們並不是編寫代碼的必需品,但能讓你的代碼更加整潔。其中一些僅僅是Ruby或者Rails新版本出現的特性。

Hash#dig

擁有7年RoR開發經驗的我最近發現,沒有在任何人的代碼中見過這個方法,原因很明顯,因爲工作使用的第一個Ruby版本是1.8,而該方法在2.3版本中引入。

你是否曾多次寫過這樣的代碼:

… if params[:user] && params[:user][:address] && params[:user][:address][:somewhere_deep]

對於Hash對象可以考慮dig 作爲安全導航操作符(&.),那麼代碼重寫後如下:

… if params.dig(:user, :address, :somewhere_deep)

Object#presence_in

這個方法在一篇關於在Ruby on Rails中查詢對象的非常好文章中見過。當你實際並不需要包含檢查的布爾結果,而是檢查對象本身時,它允許你通過簡單的方法調用來替換條件(通常是三元)。比如這樣的代碼:

` sort_options = [:by_date, :by_title, :by_author] … sort = sort_options.include?(params[:sort]) ? params[:sort]
:by_date
Another option

sort = (sort_options.include?(params[:sort]) && params[:sort]) || :by_date
`

下面這樣寫是不是更好?

params[:sort].presence_in(sort_options) || :by_date

Module#alias_attribute

項目中使用遺產數據庫時非常有用。它包含一個擁有奇怪列名(如SERNUM_0、ITMDES1_0)的表格,將表格映射到ActiveRecord模型,不是像WeirdTable.where(SERNUM_0: ‘123’)這樣編寫查詢和範圍,而是採用alias_attribute,因爲它不僅僅產生getter和setter方法()還產生斷言方法),並且查詢也很有效率。

alias_attribute :name, :ITMDES1_0

scope :by_name, -> (name) { where(name: name) }

Object#presence

相對而言,這個方法更加流行。在ApiDock上有非常好的解釋。object.presence等同於:

object.present? ? object : nil

Module#delegate

因爲某些原因幾乎不會被大部分開發者用到。方法的主要目的是解耦和遵循“得墨忒耳定律”。這個方面很有見解的文章是Avdi Grimm寫的“得墨忒耳不僅是思想,還是定律。”此外,可以參閱“Rails最佳實踐文章”利用delegate運用得墨忒耳定律。以下代碼片段可以說明:

class Profile < ApplicationRecord
belongs_to :user
delegate :email, to: :user
end

profile.email # equivalent to profile.user.email

希望你也能發現類似這樣的有用的技巧,祝編碼愉快!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章