I lost a few hours while I puzzled my way through this one.

Let’s take an ActiveFedora model:

class Document < ActiveFedora::Base
  before_create :status_is_active, :public_is_false

  property :public_domain, predicate: "http://namespace/publicDomain", multiple: false


  def public_is_false
    self.public_domain = false
  end
end

When our documents are created, by default, they aren’t public domain. Makes sense. Ok, but try and save this:

>  doc = Document.create
=> false

Huh? And then I remembered–only after some time had passed–that methods will return the most recent value of whatever was last called. So, public_is_false was not only setting the property to false but returning it as well. When the method returns false, that prevents it from saving.

To fix:

  def public_is_false
    self.public_domain = false
    true
  end

Looks a bit odd, but it works!