2014-06-09 35 views
0

我正在构建一个示例rails 4应用程序,我对某些事情还不清楚。我想通过ajax调用访问外部API来获取体育新闻的数据。rails 4--访问api数据

因此,举例来说,如果您在teams#index视图中拥有一个团队列表,那么当您单击一个团队时,一个小部件将获得该团队的最新结果/分数 - 结果信息由外部API提供服务,而不是本地数据库。

是否需要为此服务创建控制器以允许rails ajax请求拥有本地端点?实际的请求机制是否应该在此控制器中发生?或者最好为数据请求构建一个帮助器并从控制器调用它?

另一方面,可以在浏览器中通过javascript完成所有操作。

谢谢 - 我意识到有十几种方法可以在rails中做事情,我只是不清楚“正确”处理这种情况的方式。

回答

1

我倾向于用辅助模块来做到这一点,您可以单独进行单元测试。为了给你一个类似的,简单的例子,这里是一个你可以用它来包裹的Gravatar API模块:

# /lib/gravatar.rb 
module Gravatar 
    def self.exists email 
    url = self.image_url email 

    url = url + '?d=404' 

    response = HTTParty.get url 

    return response.code != 404 
    end 

    def self.image_url email, size=nil 
    gravatar_id = self.gravatar_id email 

    size_url = size ? '?s=' + size.to_s : '' 

    "http://gravatar.com/avatar/#{gravatar_id}.png" + size_url 
    end 

    def self.gravatar_id email 
    Digest::MD5::hexdigest(email.downcase) 
    end 
end 

然后,您可以拨打电话,以在必要时Gravatar::image_url。如果你希望能够通过Ajax调用访问的Gravatar图像,你可以简单地把它包在一个控制器:

# /app/controllers/api/users_controller.rb 
class Api::UsersController < Api::BaseController 
    def gravatar_for_user_id 
    user = User.find_by_id(params[:id]) 
    render plain: Gravatar::image_url user.email, :status => 200 
    end 
end 

该模型可以应用于任何你需要的外部API来打,和模块化的接口将始终使单元测试更直接。

+0

谢谢您的详细解释! – user101289

+0

@ kid_drew--我遇到了一个问题,从控制器返回一个'unintialized constant'错误。我有一个'/ lib/dataconnect.rb'模块,模块名称为'Dataconnect' - 从控制器调用'Dataconnect :: getNews'。 '/ lib /'模块是否自动加载? – user101289

+1

/lib需要添加到application.rb中的autoload_paths配置中:'config.autoload_paths + =%W(#{config.root}/lib)' –