Подтвердить что ты не робот

Возврат 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 делает, независимо от того, работает он или нет.

Это имеет смысл для меня, но мне любопытно, считается ли это хорошим или плохим способом написания методов. Имейте в виду, я спрашиваю об этом в самом общем смысле, относящемся главным образом к рубину, просто случается, что я делаю это в проекте рельсов, фактическая логика контроллера действительно не моя проблема.

4b9b3361

Ответ 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