2011-09-14 4 views
0

지불 게이트웨이와 상호 작용할 사이트 구매를 처리하는 구매 모델을 만들고 있습니다. 내 질문은 별도의 클래스 메서드를 사용하여 작업을 수행할지 콜백을 사용하여 AR 수명주기에 패치할지에 따라 인터페이스를 디자인하는 방법에 관한 것입니다.구매 모델 디자인에 대한 조언 (게이트웨이 상호 작용 포함)

처음에는 클래스 메소드로 Purchase.make_purchase (product, ...)와 같은 작업을 수행했습니다. 그러나 이것은 위대해 보이지 않았다.

구현할 항목은 모델 수명주기 및 콜백을 사용하여 구매 및 게이트웨이 트랜잭션을 만드는 솔루션입니다. 이런 식으로 뭔가 :

@purchase = Purchase.new 
@purchase.product = product 
@purchase.user = current_user 

if @purchase.save 
else 
end 

나는 다음 게이트웨이로 회담 before_save 콜백을 할 것이다 : [: gateway_error]

purchase.errors @ 설정, 실패 할 경우 저장 중지 할 수 있습니다

before_save :transfer_funds 

이것이 최선의 방법이라고 확신하지 않습니다. 어떤 충고?

답변

0

아직 익숙하지 않았기 때문에 아직 통찰력이 부족하지만 ActiveMerchant을 살펴 보겠습니다. 귀하의 지불 게이트웨이가 지금 무엇인지 모르겠지만 사용하지 않는 경우; 당신은 약간의 아이디어를 얻을 수 있습니다.

EDIT 질문에 답변하지 못했다는 것을 알고 있습니다. 아직 사용하지 않았다면 아이디어를 줄 수 있다고 생각했습니다.

나는 지불 처리에 대한 직접적인 경험이 없으므로 큰 의견으로 의견을 나눌 수 있습니다. 수명주기 방법을 사용하여에

내 큰 고려 사항은 당신이 달리 필요하지 않을 수도 있습니다,이 경우 귀하의 transfer_funds 방법에 여분의 논리를 넣을 필요가 끝날 수 있다는 것이다. 예를 들어 Purchase을 나중에 업데이트 할 수있는 경우 업데이트 할 때마다 transfer_funds 메소드를 호출하게됩니다.

Purchase에 사전 승인의 개념이 있고 실제 청구가 있는지 확실하지 않지만 transfer_funds은 한 번만 호출해야한다고 생각합니까? 대신 before_create (으)로 이동할 수는 있지만이 시나리오 만 수정할 수 있습니다.

수명주기 메소드로 이동하면 모델에 원하는 로직보다 더 많은 로직을 추가하는 경우가 종종 있습니다. 과거에는 제어기 동작에서보다 명확하게 표현되는 것이 때로는 두통을 덜어 줄 수 있음을 발견했습니다. 예를 들어 transfer_funds에 필요한 모든 위치를 수행하는 단계를 추가하더라도 말이죠.

이제 모델 클래스의 내 라이프 사이클 메소드를 ActiveRecord 모델 자체를 업데이트하고 많은 추가 작업을 수행하지 않고 유지하려고합니다. 귀하의 컨트롤러에 그것을 유지하는 것이 가능하지 않다면 ActiveRecord::Observer을 사용하여 transfer_funds과 관련된 로직을 추상화하는 것이 좋습니다.

희망이 당신에게 몇 가지 아이디어를 제공합니다.

+0

나는 활성 상인을 사용하고 있지만 질문은 아닙니다.) – pixelearth

+0

내 생각에 라이프 사이클 방법에 대한 개인적인 경험을 제공하기 위해 답을 업데이트했습니다. 아이디어를 줄 수 있기를 바랍니다. –

+0

저는 라이프 사이클 방식을 사용하여 모델을 85 % 완성했습니다.전에 before_create와 같은 결론에 도달했습니다. 당신은 그것을 볼 수 있습니다 (완료되지 않았습니다) http://pastie.org/2541360 – pixelearth