#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