Возврат истинного или сообщения об ошибке в 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

Который просто отображает сообщение об ошибке для второго вызова для тестирования.

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

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

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

13
задан seaneshbaugh 8 May 2010 в 09:13
поделиться

1 ответ

Я бы сказал, что методы, возвращающие разные типы (например, логические, строковые и числовые) при разных обстоятельствах, являются плохой практикой.

Если у вас есть какой-то метод тестирования, который хочет вернуть подробную информацию о том, почему тест не прошел, вы можете вернуть пару значений ( массив ) следующим образом:

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
22
ответ дан 1 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: