Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails web应用程序的第三方API数据_Ruby On Rails_Ajax_D3.js - Fatal编程技术网

Ruby on rails RubyonRails web应用程序的第三方API数据

Ruby on rails RubyonRails web应用程序的第三方API数据,ruby-on-rails,ajax,d3.js,Ruby On Rails,Ajax,D3.js,我有一个rubyonrailsweb应用程序,它使用第三方API,提供了一些我想使用d3可视化的数据。获取数据的最佳方式是什么?我只使用静态数据集练习过d3.js 我读了很多关于AJAX的书,但是我还是有点迷茫。如果AJAX确实是一种方式,那么有人能详细介绍一下这个过程吗 此外,当我这样做时,最好使用我的web应用程序从第三方API检索到的数据,还是d3直接从第三方API获取数据?这有很大区别吗?编辑: 为了更直接地回答您的问题,最好先在Rails中获得结果,然后在JavaScript中使用它们

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

我读了很多关于AJAX的书,但是我还是有点迷茫。如果AJAX确实是一种方式,那么有人能详细介绍一下这个过程吗

此外,当我这样做时,最好使用我的web应用程序从第三方API检索到的数据,还是d3直接从第三方API获取数据?这有很大区别吗?

编辑:

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

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


您可能需要使用RestClient gem

在您的文件中

gem 'rest-client'
然后运行
捆绑安装

然后,创建一个模型,将您的API用于:

rails g model ModelForMyApi
然后运行
rakedb:migrate

在您的模型Formyapi模型中:

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
使用

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

var jsonObj = #{@results};

// Output to log to see all the results you can play with
console.log(jsonObj);
然后,使用上面相同的JSON示例(
{“水果”:“香蕉”、“果汁”:“橙汁”}
),您可以在JavaScript中访问JSON,如下所示:

jsonObj.fruit  // Will output "banana"
现在,您可以在d3.js代码中使用API结果


您需要从Rails方法中删除
JSON.parse
的原因是,当您在Rails方法中使用它时,它将使您的响应如下所示:

//Javascript cannot interpret the arrows
{
    "fruit" => "banana",
    "juice" => "orange juice"
}
//JavaScript likes colons. No pun intended.
{
    "fruit": "banana",
    "juice": "orange juice"
}
但你需要它看起来像这样:

//Javascript cannot interpret the arrows
{
    "fruit" => "banana",
    "juice" => "orange juice"
}
//JavaScript likes colons. No pun intended.
{
    "fruit": "banana",
    "juice": "orange juice"
}

最后一个问题:这取决于具体情况。如果数据是服务器需要使用的,那么服务器应该获取数据并将其发送到视图。如果您的服务器不需要它,那么让d3处理它可能会更容易。但是,如果很多人要使用这个应用程序,那么最好定期从第三方API中提取数据并将其缓存到服务器上,这样他们的API就不会陷入困境。谢谢你Jon,也许我没有正确理解你所说的服务器。服务器是否需要“使用”数据,而不是根据请求将数据传递给应用程序?服务器是您的应用程序,而不是浏览器(d3运行的地方)是客户端。我的错,我以为您指的是数据库服务器。谢谢实际上,我已经获取并显示了JSON响应。不过,我是在视图文件(.html.erb)中用ruby语言实现的。如果我想使用d3.js,是否可以将d3代码放在我的视图文件的主体中?如果您使用的是html.erb,请像在常规html中一样使用普通标记。您可以这样设置变量:var jsonObj=#{@results}。是的,您可以将它放在视图文件中。最佳做法是将其放在页面底部,刚好在结束正文标记()之前。
jsonObj.fruit  // Will output "banana"
//Javascript cannot interpret the arrows
{
    "fruit" => "banana",
    "juice" => "orange juice"
}
//JavaScript likes colons. No pun intended.
{
    "fruit": "banana",
    "juice": "orange juice"
}