我正在向我的 Ruby on Rails 模型添加一種驗證方法,該方法根據另一個欄位的值檢查一個欄位的值。
規則是 if value_type == 'range', thena_max和b_max 必須設定。
我的方法如下所示:
def ensure_correct_type
if value_type == 'range'
if a_max.present? == false
errors.add(:a_max, 'must be set for a range.'
end
if b_max.present? == false
errors.add(:b_max, 'must be set for a range.'
end
end
end
代碼運行良好,但是我收到了 rubocop 警告:
樣式/GuardClause:使用保護子句(除非 value_type == 'range' 否則回傳),而不是將代碼包裝在條件運算式中。
在 Ruby 中撰寫這樣的內容的正確約定是什么?Robocop 中的建議是 do return unless value_type == 'range',但這似乎很奇怪,因為該方法根本不回傳。
我確實嘗試實施該建議:
def ensure_correct_type
return unless value_type == 'range'
if a_max.present? == false
errors.add(:a_max, 'must be set for a range.'
end
if b_max.present? == false
errors.add(:b_max, 'must be set for a range.'
end
end
但是后來我得到了相同的if a_max.present? == false行警告......我認為我不能return unless在那條線上做,因為我想在必要時為這兩個欄位添加錯誤。
Ruby 中處理此類事情的最佳實踐約定是什么?
uj5u.com熱心網友回復:
我會嘗試:
def ensure_correct_type
return if value_type != 'range'
errors.add(:a_max, 'must be set for a range.') if a_max.blank?
errors.add(:b_max, 'must be set for a range.') if b_max.blank?
end
或者您可以使用這樣的內置驗證:
validates :a_max, presence: true, if: :range_value_type?
validates :b_max, presence: true, if: :range_value_type?
private
def range_value_type?
value_type == 'range'
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/498038.html
