C'est une vieille question, mais j'ai rencontré le même problème récemment, alors j'ai décidé de partager. Cependant, je tiens à souligner qu'il ne s'agit pas d'une solution par session, mais d'une solution par modèle.
Comme je l'ai compris, il y a deux façons de rendre cela possible :
1. Redéfinir readonly?
Si vous parcourez le code Mongoid, vous verrez que toutes les fonctions qui sauvegardent, suppriment ou mettent à jour appellent readonly?
pour vérifier si le modèle est en lecture seule. Pas vraiment documenté et a un inconvénient -- créez et créez ! sont autorisés sur ce modèle (les destructions, les mises à jour et les sauvegardes ne fonctionneront pas).
private
def readonly?
true
end
2. Un rappel personnalisé
En plus de la méthode précédente, vous pouvez ajouter des rappels pour vous assurer que même les créations ne passeront pas :
before_create :readonly_secret
private
def readonly?
true
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end
Essentiellement, vous pouvez vous débarrasser de readonly?
method alltogether, et ajoutez d'autres rappels tels que before_save
, before_destroy
, before_update
, before_create
Manipuler "readonliness"
si vous ressentez le besoin de manipuler l'état en lecture seule à partir d'un code d'exécution, vous pouvez définir un attribut pour la classe de votre modèle :
before_create :readonly_secret
class << self
attr_accessor :readonly
end
private
def readonly?
self.class.readonly.nil? ? true : self.class.readonly
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
true
end