2011-06-12 4 views
1

나는 이것을하기위한 최선의 방법에 대해 브레인 스토밍을했고, 아이디어/명료성에 대해 커뮤니티에 문의해야한다고 생각했습니다.레일 아키텍처/모범 사례 질문

기본적으로 하나의 지불 컨트롤러에서, 나는 사용자가 선택할 수있는 다양한 지불 옵션을 처리 할 수 ​​있기를 원합니다. 예를 들어 내 컨트롤러는 :payment_option => paypal이라는 게시물 요청으로 공격을 받게됩니다. 내가 페이팔 특정 작업을 처리하는 논리를 전달하려면 다음 리디렉션 할 컨트롤러 (다시 페이팔)로 다시 손을 싶어요.

페이팔 클래스를 초기화하기 위해 params[:payment_option].constantize을하고 있었지만 paypal에 필요한 다양한 데이터 (예 : 현재 사용자 정보, 요청 IP 주소, 쿠키 데이터, URL 도우미 등)에 액세스 할 수없는 문제가 발생했습니다. .)

나는 아마도 paypal 모듈을 가질 수 있다고 생각하지만 프로그래밍 방식으로 올바른 지불 모듈을 포함시키는 방법은 무엇입니까? 그리고 그것은 내가 공유 로직이 아닌 특정 로직을 위해 모듈을 사용할 것이므로 모듈 개념을 잘못 사용하고있는 것 같았습니다. [: payment_option] 는 payment_option_url 가에 payment_option_response에게

어떤 생각을받을 얻을 사용자 대신에 관계없이 지불 방법의 구글 체크 아웃, 컨트롤러를 선택하는 경우

때문에, 일반적인 지침

가 PARAMS을

만이 필요합니다 이런 식으로 좋은 접근? 나는 과거에 비슷한 시나리오를 밟아 왔지만 그것이 최고의 루트라고 확신하지 못했습니다.

답변

2
class Payment                 
    def self.handle                
    raise 'must impliment in subclass'          
    end                   
end                   

class PaypalPayment < Payment             
end                   

class GooglePayment < Payment             
end                   

class PaymentController < ApplicationController        
    def show_me_the_money              
    case params[:payment_option]            
    when 'paypal': url = PaypalPayment.handle params       
    when 'google': url = GooglePayment.handle params       
    end  

    redirect_to url                 
    end                     
end