Возможно ли иметь одну строку, если с более чем одним результатом?

#ruby #if-statement

#ruby #if-оператор

Вопрос:

У меня есть метод с оператором if, который я хочу получить в одной строке, если это возможно. Однако одна часть условия имеет два результата — pay later и redirect_to . Возможно ли иметь это в одной строке? Ему не нравится синтаксис, когда я это делаю. (Я знаю, что это будет очень долго, если в одной строке)

     def invoice
      if @invoice.reason?
        pay_later
        redirect_to admin_invoices_path, notice: t(".success_delay")
      else
        redirect_to new_admin_invoice_payment_path(@invoice)
      end
    end 

Комментарии:

1. Почему вы хотите это сделать? Код, который у вас есть, совершенно логичен

2. Можете ли вы? Конечно, вы можете, с некоторыми круглыми скобками и точками с запятой. Должны ли вы? Абсолютно нет.

3. Рассмотрим redirect_to new_... unless @invoice.reason?; pay_later; redirect_to admin_... . Первый оператор (здесь ) иногда вызывает защитное предложение .

Ответ №1:

Конечно, вы можете попробовать

 def invoice
  @invoice.reason? ? pay_later amp;amp; redirect_to(admin_invoices_path, notice: t(".success_delay")) : redirect_to(new_admin_invoice_payment_path(@invoice))
end
 

Но это совсем не круто. И это работает, только если pay_later не возвращает ложное значение

Комментарии:

1. Вы предполагаете pay_later , что возвращает истинное значение.

2. @SergioTulentsev Я указал!

3. Давайте посмотрим, что говорит OP 🙂

4. Попробуйте сейчас @SergioTulentsev: D

5. Читаемость здесь действительно, очень низкая. Исходный код, хотя и более подробный, оставляет совершенно ясным, что происходит. По сравнению с этим это просто беспорядочный беспорядок путаницы. Это работает, но какой ценой? То, что вы можете, не означает, что вы должны.

Ответ №2:

Да, но вы, вероятно, не хотите.

 def invoice
  (pay_later; return redirect_to admin_invoices_path, notice: t(".success_delay")) if @invoice.reason?
  redirect_to new_admin_invoice_payment_path(@invoice)
end
 

Распространенный способ избежать размещения всего тела вашего метода внутри if..else блока — использовать защитное предложение:

 def invoice
  return redirect_to new_admin_invoice_payment_path(@invoice) unless @invoice.reason?

  pay_later
  redirect_to admin_invoices_path, notice: t(".success_delay")
end