通过另一个控制器(CloudMailin)调用“普通”控制器

时间:2011-08-10 13:47:57

标签: ruby-on-rails dry cloudmailin

我开发了一个普通的基于浏览器的Rails游戏应用程序。我现在正在添加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

create调用现有PbemController行为的最佳和DRYest方法是什么?我唯一真正的选择是将每个“共享”操作提取到/lib' and中的模块,包括每个控制器中的模块吗?

1 个答案:

答案 0 :(得分:1)

通常,最好的选择是尽可能多地移动到模型中。这样,任何可以从控制器执行的代码也可以从处理程序执行。

您可以制作一个像create_or_build_random这样可能对此有帮助的方法吗?