Rails ActiveRecord условно защитава атрибут от модификация

Имам модел Message с атрибут content (низ) и атрибут sent (булев). content на съобщението трябва да може да се променя, докато не бъде изпратено, след което това поле трябва да стане само за четене. (Други атрибути все още могат да бъдат променяни, като message_opened).

Как мога да постигна това? Разгледах замяна на readonly? (прилага се само на ниво запис), attr_readonly (не е условно) и валидации (не знам как да направя проверката на content да зависи както от старата му стойност, така и от полето sent).


person Sherwin Yu    schedule 01.05.2013    source източник


Отговори (2)


Оказва се, че валидациите са правилният подход: създайте персонализирано валидиране, което използва attribute_changed? („атрибут“ е името на атрибута, в този случай „съдържание“) и условно валидиране.

Message.rb:

validate_on_update :reject_modifying_content, if: :sent?

def reject_modifying_content
 errors[:content] << "can not be changed!" if self.content_changed?
end

Вижте Rails 3 проверява дали атрибутът е променен, Задаване на поле само за четене в Rails, след като е създадено и http://api.rubyonrails.org/classes/ActiveModel/Dirty.html за повече информация.

person Sherwin Yu    schedule 01.05.2013

Преглеждайки възможните отговори, мисля, че задавам полето като:

attr_readonly

Най-добрият вариант е, че ще защити напълно това поле, без да е необходим персонализиран код.

Атрибутите, посочени като само за четене, ще бъдат използвани за създаване на нов запис, но операциите за актуализиране ще игнорират тези полета.

person JAR.JAR.beans    schedule 13.09.2015