.each При входе в цикл each
в первый раз, и @numerator
@denumerator
еще не инициализированы. Переменные экземпляра отличаются от локальных переменных тем, что они оцениваются до nil
, если еще не инициализированы, тогда как ссылка на неинициализированную локальную переменную вызовет ошибку. Решение состоит в том, чтобы инициализировать переменные нейтральный элемент того, что 0
, перед входом в цикле:
def set_average_course
@course = @group.courses.find(params[:course_id])
@evaluations = @course.evaluations
@numerator = 0
@denumerator = 0
@evaluations.each do |evaluation|
@numerator += evaluation.average * evaluation.coefficient
@denumerator += evaluation.coefficient
end
@average = @numerator/@denumerator
@course.update(average: average)
end
Хотя, как примечание стороны, я думаю, что вы имеете в виду «знаменатель» вместо «знаменателя». Вы также должны учитывать в случае, когда @denumerator
равно 0
, например, когда @evaluations
пусто:
def set_average_course
@course = @group.courses.find(params[:course_id])
@evaluations = @course.evaluations
return if @evaluations.blank? # or raise an error
@numerator = 0
@denumerator = 0
@evaluations.each do |evaluation|
@numerator += evaluation.average * evaluation.coefficient
@denumerator += evaluation.coefficient
end
@average = @numerator/@denumerator
@course.update(average: average)
end
инициализируются вы '@ numerator' и' @ denumerator' '' ''? –
Если я инициализирую, я получаю: ZeroDivisionError (деленный на 0) – clement
@clement это другая проблема (с алгоритмом). –