2009-07-28 12 views
1

サイトの相互作用は、ユーザーの入力に基づいています。例えば、ユーザが支払い方法として「VISA」を選択した場合、彼はクレジットカード番号を要求する別のコントローラ/アクションにリダイレクトされる。ユーザーが「Paypal」を選択した場合、外部Webサイトにリダイレクトされます。このRailsの状況で使用する最良のRubyパターンは何ですか?

すべてのロジックをアクション自体に入れるのではなく、拡張性のためにオブジェクト内で抽象化することを考えています。例。

class Payment < ActiveRecord::Base; end 
class VisaPayment < Payment 
    def process 
    ... 
    end 
end 
class PaypalPayment < Payment 
    def process(controller) 
    ... 
    controller.redirect_to "http://paypal.com" 
    end 
end 


class OrdersController < ApplicationController 
    def accept 
    params[:select].constantize.new.process(self) 
    end 
end 

"redirect_to"のようなメソッドが保護されているため、これは機能しません。このような代表団のためのイディオムや共通のパターンはありますか?

p.s.上記のコードは、私がモジュールにそれを入れて、ケース・スイッチを介して右の方法を実行してしまう、本当に想像力ではなく、任意の実際のコーディング

答えて

1

コントローラとモデルのロジックを分けてください。あなたは後で私に感謝します。

class OrdersController < ApplicationController 
    def accept 
    payment_path = case params[:select] 
     when 'visa': credit_card_controller_path(payment_type) 
     when 'paypal': 'http://www.paypal.com' 
    end 

    redirect_to payment_path 
    end 
end 

私がこのアプローチについて気に入っているのは、読みやすく表現力があるということです。あなたは何が起こっているのか正確に知っています。コードは必要以上に巧妙ではありません。

0

の抜粋です。

case credit_card_system: 
when "VISA" then: VisaToolbox::ExecuteTransaction(params) 
when "MasterCard" then: MasterCardToolbox::ExecuteTransaction(params) 
else 
... 
end 

私はONEに他のものを常駐うコントローラ...

0

私は、コントローラコードを呼び出すActiveRecordコードを持っているとは思いません。あなたがそのように行かなければならない場合は、しかし、私はこのように、コントローラに私はあなたの「プロセスの一部」を定義します支払いでクラスメソッドを作成し、それinstance_evalをします:

class Foo 
    def self.define_process(&block) 
    @process = block 
    end 

    def self.apply_to(controller) 
    controller.instance_eval(&@process) 
    end 
end 

class SpecificFoo < Foo 
    define_process do 
    puts self.bar 
    end 
end 

class Something 
    attr_accessor :bar 
end 

something = Something.new 
something.bar = 42 

SpecificFoo.apply_to(something) 

お知らせそのコードをdefine_processに'ブロック/イテレータ/コルーチンは、自己(何かの場合はコントローラ)を指し示して実行され、あなたは保護されたものと私的なものの両方にアクセスできます。

+0

私はモデルからコントローラコードを呼び出さないことにしました。あなたのコードの設計は私にとって非常に面白いです..ありがとう! – alanho