RoR:多态控制器

时间:2011-02-15 20:18:58

标签: ruby-on-rails ruby model-view-controller design-patterns twilio

我有一个现有网站,其中包含许多不同的模型和控制器。我目前正在将Twilio的服务整合到这个网站中。 Twilio允许您提供当用户使用手机与您的电话号码交互时将被呼叫的网址。不幸的是,只有一个url可以提供给Twilio,然后所有的解析都在你的最后完成。

所以,现在我有一个twilio控制器来解析用户的数据并决定他们想要做什么。

用户可能通过手机尝试做的一切都可以在网站上完成,但现在他们可以选择在旅途中使用手机。如果他们将我的号码“创建群组foo”发送,那么该网站将尝试相应地创建群组。我的问题是我已经拥有一个知道如何创建组的组控制器,并且具有相应的before_filters以确保用户有权这样做,除其他外。

twilio控制器是否有办法解析请求,然后以某种方式将其“转发”到适当的控制器?我宁愿不让twilio控制器复制所有其他控制器中的所有代码和过滤器,并且其中一些东西不适合被推入模型中。

我对rails一般都是新手,所以我对任何建议持开放态度。我希望有一些适合我的用例的设计模式,我愿意为我的整个项目重构正确的解决方案。

1 个答案:

答案 0 :(得分:4)

我认为你可以做几件事。如果您不必以特定格式进行响应,则可以使用适当格式化的参数重定向请求。例如:

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,因此您将不会拥有经过身份验证的用户。如果是这种情况,最好将所有共享代码放入模型中,并使用TwilioController通过GroupsController和电话号码身份验证处理cookie身份验证。例如:

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