Вы можете использовать проверку, чтобы сделать это довольно хорошо.
class Thing < ActiveRecord::Base
validate :locked_cannot_be_modified
private
def locked_cannot_be_modified
errors.add(:base, "Entry is locked") if changes.any? && whatever_logic_makes_it_locked
end
end
В качестве альтернативы, вы можете реализовать только для чтения? на модели:
class Thing < ActiveRecord::Base
def readonly?
whatever_logic_makes_it_locked || super
end
end
этот подход вызовет исключение вместо ошибки проверки. Я думаю, это зависит от того, что вы пытаетесь сделать, какой подход лучше.