To stare pytanie, ale ostatnio spotkałem się z tym samym problemem, więc postanowiłem się podzielić. Chociaż chcę zauważyć, że nie jest to rozwiązanie na sesję, ale na model.
Jak się domyśliłem, są dwa sposoby, aby to umożliwić:
1. Przedefiniuj readonly?
Jeśli przejrzysz kod Mongoid, zobaczysz, że wszystkie funkcje, które zapisują, usuwają lub aktualizują, wywołują readonly?
aby sprawdzić, czy model jest tylko do odczytu. Nie do końca udokumentowane i ma wadę – twórz i twórz! są dozwolone w tym modelu (niszczenia, aktualizacje, zapisy nie będą działać).
private
def readonly?
true
end
2. Niestandardowe wywołanie zwrotne
Oprócz poprzedniej metody możesz dodać wywołania zwrotne, aby upewnić się, że nawet tworzone dzieła nie przejdą przez:
before_create :readonly_secret
private
def readonly?
true
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end
Zasadniczo możesz pozbyć się readonly?
wszystkie metody i dodaj inne wywołania zwrotne, takie jak before_save
, before_destroy
, before_update
, before_create
Manipuluj „gotowością”
jeśli czujesz potrzebę manipulowania stanem tylko do odczytu z kodu wykonawczego, możesz zdefiniować atrybut dla klasy modelu:
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