rails:针对不同用户的不同方法

时间:2013-11-25 10:10:28

标签: ruby-on-rails api httparty

我的用户模型上有一个位置字段,有两个可能的值,西班牙和法国(未来可能更多)。我需要为每个用户进行API调用,但根据用户的位置调用不同的API(同样,以不同方式解析响应)。我不知道解决这个问题的最佳方法是什么。

这或多或少是我现在的代码:

class Api::Foobar
  include HTTParty
  base_uri 'http://demo.foobar.es/vweb/xml'

  GLOBAL_OPTIONS = {edad: 'anciano', farmacovigilancia: false, deportista: false, administrativas: false}

  def initialize(user)
    @user = user
  end

  def contraindications
    self.class.get("/ws_patient/alertas", query: GLOBAL_OPTIONS.merge(user_options) )
  end

  def self.medications_by_name(name)
    response = get("/ws_drug/SearchByName", query: {value: name} )
    response['object']['drug_set']['drug']
  end

  .....

end

我正在做Api::Foobar.medications_by_name('asp')Api::Foobar.new(User.first).contraindications

之类的事情

我想构建一个抽象层,允许我为每个用户调用相同的方法,并根据用户位置自动选择适当的类/模块/ api。谁能指出我正确的方向?在构建这样的抽象层时,最好的做法是什么?

==========编辑==========

我最终将这些类命名为另一个级别并将此方法添加到User类:

  def foobar_api
    if !self.location.nil?
      Object.qualified_const_get("Api::Foobar::#{self.location.capitalize}").new(self)
    else
      Api::Foobar::Spain.new(self)
    end
  end

现在我正在呼叫User.first.foobar_api.contraindications

如果这是一个好主意,有人会评论吗?或者如果有更好的方式

1 个答案:

答案 0 :(得分:0)

在接受用户对象的类中有一个perform方法。根据用户位置值,您可以在内部方法中使用其中一个。