4

我有一个现有的站点,其中包含许多不同的模型和控制器。我目前正在将 Twilio 的服务集成到该站点中。Twilio 允许您提供一个 url,当用户使用他们的电话与您的电话号码交互时将调用该 URL。不幸的是,您只能向 Twilio 提供一个 url,然后所有的解析都在您的端完成。

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

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

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

总的来说,我对 Rails 有点陌生,所以我愿意接受任何建议。我希望有一些适合我用例的设计模式,我愿意重构我的整个项目以获得正确的解决方案。

4

1 回答 1

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,因此您将没有经过身份验证的用户。如果是这种情况,最好将所有共享代码放入模型中,并使用 GroupsController 处理 cookie 身份验证,并使用 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
于 2011-02-15T20:51:13.487 回答