2017-10-28 107 views
2

我使用的模型枚举,我要覆盖砰方法,例如:使用Rails枚举

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

    def ok! 
    self.error_message = nil 
    super 
    end 
end 

测试此覆写爆炸方法,它工作正常。有没有潜在的缺陷?

另外,岂不是更好/清洁剂超完全跳过:

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

谢谢!

+0

更新:我意识到调用'super'会导致一些问题,如果我想将参数传递给新方法,所以我认为我已经决定显式调用''save''或''save!''等等。 – richleenyc

回答

1

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

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

为了保持一致性,我建议使用super,但这一切都取决于您希望如何处理验证问题。

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

+0

+1用于指出验证和返回值的差异。根据我更新的评论,我也意识到在传递参数时存在问题。所以我现在要避免使用“超级”,并明确使用任何重写方法。 – richleenyc