2011-08-10 8 views
0

私は通常のブラウザーベースのRailsゲームアプリケーションを開発しました。私はCloudMailinをこのミックスに追加しています。これは、電子メールで代替インターフェイスを効果的に公開しています。別のコントローラー(CloudMailin)を介して「通常の」コントローラーを呼び出す

は私の既存のcreateアクション、代表的な例として、考えてみましょう:

class GamesController < ApplicationController 

    def create 
    @game = Game.params[:new] 

    if @game.random_create 
     # Asked to create a game using random choices. 
     # Make the random choices, then present it to the user for tweaking 
     @game.expand_random_choices 

     render :action => new 
    else 
     # Fully specified. Create the game 
     begin 
     @game.save! 

     # ...other work including DB operations ... 

     flash[:notice] += 'Game was successfully created.' 
     redirect_to :action => :play, :id => @game 
     rescue ActiveRecord::RecordInvalid 
     @game.valid? 
     render :action => 'new' 
     end 
    end 
    end 
end 

私は今Cloudmailinの電子メールを処理するために私PbemControllerを持っている:

class PbemController < ApplicationController 

    # Handle inbound email 
    def handle 
    if email_is_a_game_creation 
    ... 
    end 

    render :text => "Handled" 
    end 
end 

既存を呼び出すためのどのような最善とDRYest方法createの動作はPbemControllerからですか?私の唯一の現実的な選択肢は、それぞれのコントローラでそれぞれの "共用"アクションをモジュールに含めることです(/lib' and)。

答えて

1

通常、モデルにできるだけ多くを移動することをお勧めします。このようにして、コントローラから実行可能なコードをハンドラから実行することもできます。

ここで助けになる可能性のあるcreate_or_build_randomのような方法を作ることができますか?

+0

私はおそらく、私のコントローラーに少し余裕があると思います。私はそれができるかどうかを見ます。 – Chowlett

+0

実際、ゲームのロジックの大部分は、ゲームのモデルにあります。コントローラa)はゲームに何を尋ねるかを決定する。 b)無効なパラメータを報告するゲームを処理する。 c)セッションユーザのために新たなプレイヤーと新しいゲームをリンクすることを処理する。 d)フラッシュを設定する。 e)レンダリングまたはリダイレクト。それはモデルの中にあるはずのもののように感じません。 – Chowlett

+0

私には、モデルの中に項目を置くべきではないなら、コントローラからのメールハンドラ内で複製するのではなく、この場所にそのメールハンドラに固有のコードを追加するのでしょうか? –

関連する問題