rails on web web应用程序上的ruby的第三方API数据

amp*_*nds 2 ajax ruby-on-rails d3.js

在rails web应用程序有一个ruby,它使用第三方API,它提供了一些我想用d3可视化的数据.什么是获取数据访问权限的最佳方式?我只用静态数据集练习d3.js.

我阅读了如何使用来自Rails数据库的数据创建d3图形,并且我读了AJAX的内容,但仍然有点迷失.如果AJAX确实是这样话,任何人都可以详细说明这个过程吗?

此外,当我这样做时,最好是使用我的Web应用程序从第三方API检索的数据,还是应该直接从第三方API获取数据?它有很大的不同吗?

Gra*_* S. 5

编辑:

为了更直接地回答你的问题,最好先在Rails中获得结果,然后在JavaScript中使用它们,只是为了让它更好地组织起来.

此外,在页面加载上进行AJAX调用以获取数据而不是使用Rails是(根据我的经验),异步调用将无法在JavaScript代码尝试访问数据之前加载数据(如果它也需要长).您必须将AJAX调用设置为synchronous,以便AJAX首先返回数据,然后执行以下任何代码.如果返回了大量数据,则可能导致页面加载时间过长,这对用户体验不利.


您可能需要使用RestClient gem.

在你的Gemfile中:

gem 'rest-client'
Run Code Online (Sandbox Code Playgroud)

然后跑bundle install.

然后,创建一个模型以使用您的API:

rails g model ModelForMyApi
Run Code Online (Sandbox Code Playgroud)

然后跑rake db:migrate.

ModelForMyApi模型中:

class ModelForMyApi < ActiveRecord::Base
    require 'rest_client'

    @url

    def self.getData
        response = RestClient(@url, { :content_type => :json, "Api-Key" => "put your API key here" }
    end

    def self.retrieve_results(myParameter)
         @url = "myApiUrl.com/stuff/?putYourParamNameHere=#{myParameter}"
        JSON.parse(ModelForMyApi.getData)
    end
end
Run Code Online (Sandbox Code Playgroud)

所以在您的控制器中,您可以执行以下操作:

class ExamplesController < ApplicationController
    def index
        @results = ModelForMyApi.retrieve_results("superCoolParameter")
    end
end
Run Code Online (Sandbox Code Playgroud)

并在index.html.erb文件中显示结果:

<%= @results %>
Run Code Online (Sandbox Code Playgroud)

这将显示整个JSON响应.如果要访问键值对中的值,请参考此示例.

假装这是你的回答:

// This is a Rails JSON object, it has arrows.
// See below for how to incorporate this in your JavaScript
{
    "fruit" => "banana",
    "juice" => "orange juice"
}
Run Code Online (Sandbox Code Playgroud)

运用

<%= @results['fruit']  %>
Run Code Online (Sandbox Code Playgroud)

在您的视图中将显示"香蕉".这就是我用Rails进行API调用的方式.我不知道如何使用d3.js实现,但我认为最好的方法是首先从API获取结果,然后将这些结果包含在JavaScript中.

编辑

由于您需要将它与JavaScript一起使用,因此在Rails中解析JSON响应可能不是最好的方法.在这种情况下,最好完全按照我上面的说明去做,但是JSON.parse()self.retrieve_results方法中删除该功能.这将返回一个普通的JSON对象而不是Rails JSON对象.

所以在ModelForMyApi中,JSON.parse从返回行中删除:

class ModelForMyApi < ActiveRecord::Base
    require 'rest_client'

    @url

    def self.getData
        response = RestClient(@url, { :content_type => :json, "Api-Key" => "put your API key here" }
    end

    def self.retrieve_results(myParameter)
         @url = "myApiUrl.com/stuff/?putYourParamNameHere=#{myParameter}"
        ModelForMyApi.getData  #JSON.parse was removed 
    end
end
Run Code Online (Sandbox Code Playgroud)

在您的JavaScript中,您所要做的就是:

var jsonObj = #{@results};

// Output to log to see all the results you can play with
console.log(jsonObj);
Run Code Online (Sandbox Code Playgroud)

然后,使用上面({"fruit": "banana", "juice": "orange juice"})中相同的JSON示例,您可以在JavaScript中访问JSON,如下所示:

jsonObj.fruit  // Will output "banana"
Run Code Online (Sandbox Code Playgroud)

现在,您可以在d3.js代码中使用API​​结果.


您需要JSON.parse从Rails方法中删除它的原因是因为当您在Rails方法中使用它时,它将使您的响应看起来像这样:

//Javascript cannot interpret the arrows
{
    "fruit" => "banana",
    "juice" => "orange juice"
}
Run Code Online (Sandbox Code Playgroud)

但你需要它看起来像这样:

//JavaScript likes colons. No pun intended.
{
    "fruit": "banana",
    "juice": "orange juice"
}
Run Code Online (Sandbox Code Playgroud)