譯者注:Ruby語言以其靈活性為人所稱道,而Ruby on Rails使用了該語言的靈活性,本文作者列舉了RoR五點不為人知的使用技巧。
從開始使用Ruby on Rails到現在,幾年過去了,我一直沒有停止在Ruby的世界中探索。Ruby總能為開發者帶來快樂,這些樂趣來源于從中尋求的一些新東西。
這篇文章將分享我近期的一些新發現,包括一些很少使用的方法,多數”語法糖果”,它們并不是編寫代碼的必需品,但能讓你的代碼更加整潔。其中一些僅僅是Ruby或者Rails新版本出現的特性。
擁有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)
這個方法在一篇關于在Ruby on Rails中查詢對象的非常好文章中見過。當你實際并不需要包含檢查的布爾結果,而是檢查對象本身時,它允許你通過簡單的方法調用來替換條件(通常是三元)。比如這樣的代碼:
sort = (sort_options.include?(params[:sort]) && params[:sort]) || :by_date
`
下面這樣寫是不是更好?
params[:sort].presence_in(sort_options) || :by_date
項目中使用遺產數據庫時非常有用。它包含一個擁有奇怪列名(如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) }
相對而言,這個方法更加流行。在ApiDock上有非常好的解釋。object.presence等同于:
object.present? ? object : nil
因為某些原因幾乎不會被大部分開發者用到。方法的主要目的是解耦和遵循“得墨忒耳定律”。這個方面很有見解的文章是Avdi Grimm寫的“得墨忒耳不僅是思想,還是定律。”此外,可以參閱“Rails佳實踐文章”利用delegate運用得墨忒耳定律。以下代碼片段可以說明:
class Profile < ApplicationRecord
belongs_to :user
delegate :email, to: :user
end
...
profile.email # equivalent to profile.user.email
希望你也能發現類似這樣的有用的技巧,祝編碼愉快!
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。