Возврат true или сообщение об ошибке в Ruby
Мне интересно, что такие функции написаны как хорошие или плохие.
def test(x)
if x == 1
return true
else
return "Error: x is not equal to one."
end
end
И затем, чтобы использовать его, мы делаем что-то вроде этого:
result = test(1)
if result != true
puts result
end
result = test(2)
if result != true
puts result
end
Что именно отображает сообщение об ошибке для второго вызова для тестирования.
Я планирую это сделать, потому что в проекте rails я работаю внутри своего кода контроллера, я делаю вызовы методов экземпляра модели, и если что-то пойдет не так, я хочу, чтобы модель возвращала сообщение об ошибке контроллеру и контроллер принимает это сообщение об ошибке и помещает его во флэш-память и перенаправляет. Как-то вроде этого
def create
@item = Item.new(params[:item])
if [email protected]?
result = @item.save_image(params[:attachment][:file])
if result != true
flash[:notice] = result
redirect_to(new_item_url) and return
end
#and so on...
Таким образом, я не создаю сообщения об ошибках в контроллере, просто передавая их, потому что я действительно не хочу, чтобы диспетчер был связан с тем, что сам метод save_image делает, независимо от того, работает он или нет.
Это имеет смысл для меня, но мне любопытно, считается ли это хорошим или плохим способом написания методов. Имейте в виду, я спрашиваю об этом в самом общем смысле, относящемся главным образом к рубину, просто случается, что я делаю это в проекте рельсов, фактическая логика контроллера действительно не моя проблема.
Ответы
Ответ 1
Я бы сказал, что методы, возвращающие разные типы (например, boolean vs. string vs. numbers) при разных обстоятельствах, являются плохой практикой.
Если у вас есть какой-то метод тестирования, который хочет вернуть сведения о том, почему тест не прошел, вы можете вернуть пару значений (a Array
) следующим образом:
def test(x)
if x == 1
return true, "x is fine"
else
return false, "Error: x is not equal to one."
end
end
а затем напишите раздел вашего кода контроллера как:
valid, message = @item.save_image(params[:attachment][:file])
if !valid
flash[:notice] = message
redirect_to(new_item_url) and return
end
Если вы говорите о методе save_image
, который будет выполняться большую часть времени, но может потерпеть неудачу, и вы хотите указать этот отказ и причину, то я бы использовал исключения, например
def save_image(file)
raise "No file was specified for saving" if file.nil?
# carry on trying to save image
end
а затем ваш код контроллера будет выглядеть следующим образом:
begin
result = @item.save_image(params[:attachment][:file])
rescue Exception => ex
flash[:notice] = ex.message
redirect_to(new_item_url) and return
end