Нет, вам не нужно возвращать true из обратных вызовов Rails.Вы можете вообще ничего не вернуть, или true, или 3.141592, и он все равно будет сохранен.Единственное, что имеет значение, это если вы вернете false, и это применимо только до Rails 5. Возвращение false отменит сохранение до Rails 5. Возвращение true никогда не оказывало никакого эффекта.
Для Rails 5+, новый способ заблокировать обновление - вызвать исключение: throw(:abort)
. .Это более интуитивно понятно и менее подвержено ошибкам.Возвращаемое значение не влияет на то, будет ли оно сохранено, если вы не сконфигурируете устаревшее поведение.
Это допустимо - и, как мне кажется, хорошая СУХАЯ практика - просто продолжать свой бизнес и ничего не возвращать;просто убедитесь, что случайно не возвращаете false неявно, если используете более ранние Rails.Например:
# This is fine, record will be saved
def before_save
self.foo = 'bar' # Implicitly returns 'bar'
end
# This is an accidental veto, record will not be saved
def before_save
Rails.logger.info 'user requested save'
self.fresh = false # Oops! Implicitly returns false
end
# One way to rectify the above example (another would be to re-order if it's possible)
def before_save
Rails.logger.info 'user requested save'
self.fresh = false
return # Implicitly returns nil. Could also do `return true`
end
Гвоздика здесь в том, что вы можете забыть, что некоторые функции «процедурного» типа возвращают логическое значение в качестве кода состояния или просто потому, что реализация заканчивается логическим значением в качестве стороныэффект.Вы можете подумать, что мутируете строку или что-то в этом роде, но в итоге случайно наложите вето на обратный вызов.Поэтому, хотя я думаю, что обычно слишком шумно для явного возврата из обратных вызовов, вам нужно позаботиться о неявных возвратах.Одна из причин, по которой люди выступали за возвращение истины, заключалась в том, чтобы защититься от этой ошибки.