在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
中计算的,请考虑是否需要此保护,或者是否有效属性可以有效地使问题消失。