0

У меня есть действие контроллера в рельсах, которое должно проверять, является ли текущий статус транзакции транзакцией либо «отправлено_объект», либо «авторизован», а затем void транзакция, но если статус " поселился ", то возврат сделка. Как-то контроллер упраздняет все транзакции и не работает так, как я этого хочу. Вот пример моего кода:Rails условная логика не работает

@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 

Я получаю сообщение об ошибке о сделках, которые обосновались, что говорит: «Сделки могут быть аннулированы, только если они имеют право или submitted_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 
+0

Я попробовал это, и теперь я получаю неопределенный метод for nil: Ошибка NilClass – simon

+0

Тогда каково возвращаемое значение 'void' или' refund'? Что делать, если '@ transaction' не авторизовано, отправлено_очередной или не разрешено? – Aetherus

+0

Я проверил транзакцию.status braintree отправляет обратно, и ее показывается как «улаженный». Это ошибка рельсов, вызванная логикой. Я получаю ошибку, потому что вызов api никогда не был создан, и я проверяю результат, который никогда не отправлялся. Если статус был чем-то иным, чем разрешенным, отправленным_for_settlement или установленным, он будет отображаться здесь: redirect_to orders_path, alert: «транзакция не может быть отменена. Код: #{@result.transaction.processor_response_code} текст: #{@result.transaction.processor_response_text} "n – simon

Смежные вопросы