【问题标题】:Switching if statement for guard clause when not returning a value不返回值时为保护子句切换 if 语句
【发布时间】:2022-06-30 23:56:57
【问题描述】:

我正在向我的 Ruby on Rails 模型添加一种验证方法,该方法根据另一个字段的值检查一个字段的值。

规则是如果value_type == 'range',那么a_maxb_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 中的建议是执行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 中处理此类事情的最佳实践约定是什么?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我会尝试:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2015-07-28
      相关资源
      最近更新 更多