Essa é uma pergunta antiga, mas encontrei o mesmo problema recentemente, então decidi compartilhar. Embora, quero observar, que esta não é uma solução por sessão, mas por modelo.
Como eu descobri, existem duas maneiras de tornar isso possível:
1. Redefinir readonly?
Se você examinar o código Mongoid, verá que todas as funções que salvam, excluem ou atualizam chamam
readonly?
para verificar se o modelo é somente leitura. Não está realmente documentado e tem uma desvantagem - criar e criar! são permitidos neste modelo (destroys, updates, saves não serão executados). private
def readonly?
true
end
2. Um retorno de chamada personalizado
Além do método anterior, você pode adicionar callbacks para garantir que nem as criações passem:
before_create :readonly_secret
private
def readonly?
true
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end
Essencialmente, você pode se livrar de
readonly?
método todos juntos e adicione outros retornos de chamada, como before_save
, before_destroy
, before_update
, before_create
Manipule a "leitura"
se você sentir a necessidade de manipular o estado somente leitura de um código de tempo de execução, você pode definir um atributo para a classe do seu 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