Ты в значительной степени там.Ваша проблема в том, что вы выполняете проверку после сохранения, а не раньше.После сохранения записи обновление уже выполнено, поэтому система считает, что ничего не изменилось.
Изменить
after_save :check_is_completed
after_update :check_is_completed
На
before_save :check_is_completed
ВыТакже не нужно использовать какие-либо переменные экземпляра.Поскольку вы уже в своем классе, все, что вам нужно сделать, это:
def check_is_completed
return unless completed_changed?
self.completed_at = Date.new() if completed?
end
Это выполнит проверку перед каждым сохранением, ничего не делая, пока не будет изменен завершенный атрибут, а затем только обновит поле complete_atесли выполнено, верно