Я задаюсь вопросом при записи, что функции как это считают хорошей или невоспитанностью.
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
Который просто отображает сообщение об ошибке для второго вызова для тестирования.
Я рассматриваю выполнение этого, потому что в проекте направляющих я продолжаю работать в своем коде контроллера, я выполняю вызовы к методам экземпляра модели и если что-то идет не так, как надо, я хочу, чтобы модель возвратила сообщение об ошибке контроллеру, и контроллер берет то сообщение об ошибке и помещает его во флэш-память и перенаправления. Отчасти как это
def create
@item = Item.new(params[:item])
if !@item.nil?
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 метод делает просто, работал ли он.
Это имеет смысл мне, но мне любопытно относительно того, считают ли это хорошим или плохим способом методов записи. Следует иметь в виду, что я спрашиваю это в самом общем смысле, принадлежащем главным образом рубину, это просто происходит, что я делаю это в проекте направляющих, фактическая логика контроллера действительно не является моим беспокойством.
Я бы сказал, что методы, возвращающие разные типы (например, логические, строковые и числовые) при разных обстоятельствах, являются плохой практикой.
Если у вас есть какой-то метод тестирования, который хочет вернуть подробную информацию о том, почему тест не прошел, вы можете вернуть пару значений ( массив
) следующим образом:
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