2014-06-09 62 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)' –