Rails условная логика не работает
У меня есть действие контроллера в рельсах, которое должно проверять, является ли текущий статус транзакции braintree либо "submit_for_settlement", либо "санкционировано", а затем аннулировать транзакцию, но если статус "урегулирован", возместить транзакцию. Каким-то образом контроллер отменяет все транзакции и не работает так, как я хочу. Вот пример моего кода:
@transaction = Braintree::Transaction.find(@id)
if @transaction.status == "authorized" || "submitted_for_settlement"
@result = Braintree::Transaction.void(@id)
elsif @transaction.status == "settled"
@result = Braintree::Transaction.refund(@id)
end
if @result.success?
@order.update(status: "voided")
redirect_to orders_path, notice: "transaction successfully voided "
elsif @result.transaction
redirect_to orders_path, alert: "transaction could not be cancelled code: #{@result.transaction.processor_response_code} text: #{@result.transaction.processor_response_text}"
else
errors = @result.errors.map { |error| "Error: #{error.code}: #{error.message}" }
flash[:error] = errors
redirect_to orders
end
Я получаю сообщение об ошибке для транзакций, которые урегулированы, в котором говорится, что "Транзакции могут быть аннулированы, только если они авторизованы или submit_for_settlement", но все транзакции, которые авторизованы и переданы для расчета, запускаются корректно.
Что еще больше беспокоит, так это то, что контроллер аннулирует статус в базе данных, даже когда я получаю сообщение об ошибке, и транзакции с расчетом без ограничений остаются неизменными.
почему я получаю эту ошибку?
1 ответ
Изменить линию
if @transaction.status == "authorized" || "submitted_for_settlement"
в
@transaction.status == "authorized" || @transaction.status == "submitted_for_settlement"
Так как ==
имеет более высокий приоритет, чем ||
, @transaction.status == "authorized" || "submitted_for_settlement"
эквивалентно (@transaction.status == "authorized") || "submitted_for_settlement"
, Так что если статус "авторизован", это выражение возвращает true
в противном случае возвращает строку "submitted_for_settlement"
, что также считается правдой в Ruby.
Я бы предложил определить некоторые методы Braintree::Transaction
:
class Braintree::Transaction
%w(authorized submitted_for_settlement settled).each do |status|
define_method("#{status}?") do
self.status == status
end
end
end
Тогда в вашем контроллере
if @transaction.authorized? || @transaction.submitted_for_settlement?
# ...
elsif @transaction.settled?
# ...
end