Rails-如何保护属性免受模型外部更新



在Rails 5中,我有一个具有属性的模型,其值永远不会直接设置,但始终在before_save回调中计算。我想保护此属性免于从模型外部更新,以便像f这样的调用。e。update_attribute()将失败。我在模型中使用了attr_readonly来实现我想要的东西,并且它效果很好,直到我意识到它可以预防 ash all 更新!也来自模型本身。由于根据Rails API文档这是正确的行为,因此拒绝对特定属性的修改的最佳方法是什么?

您可以覆盖设置器。在模型上:

def protected_attr_name=(val)
  # raise SomeException
end

此禁用:

model.protected_attr_name = "value"  # => raise exception
model.update_attributes(protected_attr_name: "value")  # => raise exception

,然后在您的before_save方法/块中:

write_attribute(:protected_attr_name, calculated_value)

其他观察

attr_readonly一样,您可以选择不引起异常,也不要做任何事情。这可能会使在同一代码库上工作的其他人感到困惑/沮丧,并且可能是非常不太明显的行为。

另外 - 如果是始终在before_save中计算的,请考虑是否需要此保护,或者是否有效属性可以有效地使问题消失。

最新更新