Rails在更新属性后只读取记录

时间:2016-01-09 14:33:32

标签: ruby-on-rails-4 rails-activerecord

我的模型有一个属性void。如果void为真,我希望记录是只读的。 我试过了:

def readonly?
  self.void
end

但这会使我无法保存记录,因为在保存之前void已经为真。使用void=true保存记录会引发ActiveRecord::ReadOnlyRecord例外。所以我永远不会真正将void=true存储在数据库中。

如何在保存readonly

后保存记录void=true

4 个答案:

答案 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