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
Другие вопросы по тегам