我的模型有一个属性void
。如果void
为真,我希望记录是只读的。
我试过了:
def readonly?
self.void
end
但这会使我无法保存记录,因为在保存之前void已经为真。使用void=true
保存记录会引发ActiveRecord::ReadOnlyRecord
例外。所以我永远不会真正将void=true
存储在数据库中。
如何在保存readonly
void=true
答案 0 :(得分:1)
def readonly?
persisted? && void
end
修改强>
它只适用于新记录。
如果你需要使用持久性记录,你可以通过下一个方式来实现:
在您的模型中:
attr_accessor :editable
def readonly?
editable || !void ? false : true
end
答案 1 :(得分:0)
您可以尝试检查void
属性是否有变化?
E.g。
def readonly?
!void_just_changed? && void
end
def void_just_changed?
void_was.blank? && void?
end
您可以将void_just_changed?
修改为适合您的任何内容,例如允许将void设置为false。
答案 2 :(得分:0)
我找到了一种方法来做到这一点而不添加任何变量,但是,结果行为有点不同。
<A HREF="ftp://user:password@server/pathname">...</A>
使用此方法,记录将正确标记为只读,但允许修改其属性,您将无法保存它。相反,如果您从def readonly?
begin
prev = self.class.find(self.id)
prev.void && self.void
rescue ActiveRecord::RecordNotFound
false
end
end
方法手动返回true,则会引发readonly?
(我认为这是更可取的)。 如果有人能解释原因,那就太好了。
答案 3 :(得分:0)
我有另一种变体:
def readonly?
!persisted? || void_changed? ? false : void
end
每次更改空白记录时,它的意思是在其他情况下不是只读的吗?取决于 void