Esa es una vieja pregunta, pero encontré el mismo problema recientemente, así que decidí compartir. Aunque quiero señalar que esta no es una solución por sesión, sino por modelo.
Como descubrí, hay dos formas de hacerlo posible:
1. ¿Redefinir readonly?
Si revisa el código Mongoid, verá que todas las funciones que guardan, eliminan o actualizan, llaman a readonly?
para comprobar si el modelo es de sólo lectura. No está realmente documentado y tiene un inconveniente:¡crear y crear! están permitidos en este modelo (aunque las operaciones de destrucción, actualización y guardado no se ejecutarán).
private
def readonly?
true
end
2. Una devolución de llamada personalizada
Además del método anterior, puede agregar devoluciones de llamada para asegurarse de que ni siquiera las creaciones pasen:
before_create :readonly_secret
private
def readonly?
true
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end
Esencialmente, puede deshacerse de readonly?
método en conjunto, y agregue otras devoluciones de llamada como before_save
, before_destroy
, before_update
, before_create
Manipular "readonliness"
si siente la necesidad de manipular el estado de solo lectura desde un código de tiempo de ejecución, puede definir un atributo para la clase de su modelo:
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