RoR: полиморфные контроллеры - PullRequest
4 голосов
/ 15 февраля 2011

У меня есть сайт, на котором есть несколько разных моделей и контроллеров. В настоящее время я интегрирую услуги Twilio в этот сайт. Twilio позволяет вам указывать URL, который будет вызываться, когда пользователь взаимодействует с вашим номером телефона с помощью своего телефона. К сожалению, есть только один URL, который вы можете предоставить Twilio, и тогда весь анализ выполняется с вашей стороны.

Итак, теперь у меня есть контроллер twilio, который анализирует данные пользователя и решает, что они пытаются сделать.

Все, что пользователь может пытаться сделать с помощью своего телефона, уже можно сделать на веб-сайте, но теперь у него есть возможность использовать свой телефон, когда он в пути. Если они напишут мой номер "create group foo", сайт попытается создать группу соответствующим образом. Моя проблема в том, что у меня уже есть контроллер групп, который знает, как создавать группы, и имеет соответствующие before_filters, чтобы убедиться, что у пользователя есть разрешение на это, среди прочего.

Есть ли способ для контроллера twilio проанализировать запрос и затем каким-то образом "переслать" его на соответствующий контроллер? Я бы предпочел, чтобы контроллер twilio не дублировал весь код и фильтры, которые есть в каждом другом контроллере, и некоторые из этих вещей не подходят для использования в моделях.

Я несколько новичок в рельсах в целом, поэтому я открыт для любых предложений. Я надеюсь, что есть какой-то шаблон проектирования, который подходит для моего варианта использования, и я хочу реорганизовать весь мой проект для правильного решения.

1 Ответ

4 голосов
/ 15 февраля 2011

Я думаю, что есть пара вещей, которые вы можете сделать. Если вам не нужно отвечать в определенном формате, вы можете просто перенаправить запрос с правильно отформатированными параметрами. Например:

class TwilioController
  def create
    if params[:twilio_action] == 'create group'
      redirect_to create_group_path(:id => params[:group_id], :number => params[:number])
    end
  end
end

Вполне вероятно, что у вас возникнут проблемы с аутентификацией, поскольку twilio api не будет отправлять и получать файлы cookie для вас, поэтому у вас не будет аутентифицированного пользователя. В этом случае лучше всего поместить в код весь ваш общий код и обработать аутентификацию cookie с помощью вашего GroupsController, а аутентификацию по телефонному номеру - с помощью TwilioController. Например:

class TwilioController
  def create
    if params[:twilio_action] == 'create group'
      if can_create_group?(params[:phone_number])
        Group.create(:id => params[:group_id])
      end
    end
  end
end

Всегда лучше поместить свою бизнес-логику в модель, но если у вас действительно есть функция, которой вы хотите поделиться в двух контроллерах, вы всегда можете создать модуль для этого:

module GroupControllerActions
  def create_group user
    Group.create(params[:group].merge({:user => user}))
  end
end

class TwilioController
  include GroupControllerActions

  def create
    if params[:twilio_action] == 'create group'
      create_group(User.find_by_number(params[:phone_number]))
    end
  end
end

class GroupsController
  def create
    create_group(current_user)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...