2

У меня есть модель Message с атрибутом content (строка) и атрибутом sent (boolean). A сообщение content должно быть изменено до тех пор, пока оно не будет отправлено, после чего это поле должно быть прочитано только. (Другие атрибуты могут быть модифицируемыми, например message_opened).Rails ActiveRecord условно защищает атрибут от модификации

Как это сделать? Я рассмотрел переопределение readonly? (применяется только на уровне записи), attr_readonly (не условно) и валидации (не знаю, как сделать валидацию content зависеть как от ее старого значения, так и от поля sent).

ответ

3

Выбирает правильность выбора: создайте пользовательскую проверку, которая использует 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 check if attribute changed, Setting a field to read-only in Rails after it's created и http://api.rubyonrails.org/classes/ActiveModel/Dirty.html для получения дополнительной информации.

0

Перебирая возможные ответы, я думаю, что установка поля:

attr_readonly 

Это лучший вариант будет полностью защитить это поле без пользовательского кода необходим.

Атрибуты, перечисленные как readonly, будут использоваться для создания новой записи, но операции по обновлению будут игнорировать эти поля.