Вызвать "обычный" контроллер через другой контроллер (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

Теперь у меня есть мой PbemController для обработки электронной почты Cloudmailin:

class PbemController < ApplicationController

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

    render :text => "Handled"
  end
end

Какой самый лучший и самый сухой способ призвать существующие create поведение от PbemController? Является ли мой единственный реальный вариант извлечения каждого "общего" действия в модуль в /lib' andвключить что в каждом контроллере?

1 ответ

Решение

Обычно лучшим вариантом является перемещение в модель как можно больше. Таким образом, любой код, который может быть выполнен из контроллера, также может быть выполнен из обработчика.

Вы можете быть в состоянии сделать метод, как create_or_build_random что может потенциально помочь здесь?

Другие вопросы по тегам