【问题标题】:Overwriting bang methods with Rails enums使用 Rails 枚举覆盖 bang 方法
【发布时间】:2017-10-28 16:18:44
【问题描述】:

我在模型中使用枚举,我想覆盖bang方法,例如:

class Foo < Application Record
  enum status: [:ok, :error]

  def ok!
    self.error_message = nil
    super
  end
end

对此进行测试,它工作正常。有没有潜在的陷阱?

或者,完全跳过 super 是否更好/更清洁:

def ok!
  self.update_attributes(status: :ok, error_message: nil)
end

谢谢!

【问题讨论】:

  • 更新:我意识到如果我想将参数传递给新方法,调用super 会导致一些问题,所以我想我决定明确地调用savesave!根据需要等。
  • 您可以使用super() 而不是super,以免将任何参数传递给原始ok! 方法。

标签: ruby-on-rails enums


【解决方案1】:

这一切都取决于你想做什么。调用super 将使用update! 方法更新属性,如果存在验证问题,该方法将抛出异常。

反之,如果验证失败,调用self.update_attributes(status: :ok)会返回false,但不会抛出异常。

为了保持一致性,我推荐super,但这完全取决于您希望如何处理验证问题。

注意:这是基于对Rails 5.1 enum source code 的审查,并已在 Rails 5.1 中进行了测试。

【讨论】:

  • +1 用于指出验证和返回值的差异。根据我更新的评论,我也意识到传入 args 时存在问题。所以我现在要避免 super 并明确使用任何覆盖方法。
猜你喜欢
  • 2016-09-23
  • 2021-07-18
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多