2014-11-06 21 views
0

我正在使用the PhantomJS gem从Ruby调用PhantomJS脚本。为什么我无法将JSON从Ruby发送到Phantomjs

当我需要将HTML发送到我打电话给的PhantomJS脚本时,我已经在我的应用程序中成功使用了该gem。

但是,当我尝试将JSON发送到我打电话给的PhantomJS脚本时,它失败了。

我打来的PhantomJS脚本是PhantomJS-Google-Charts

我修改剧本的前几行改为:

var system = require('system'); 
var fs = require('fs'); 
var jsonData = fs.open(system.args[1], 'r'); // also tried 'rb' 

// exports.generateChart = function(jsonData, callback){ 
    var page = require('webpage').create(); 

    page.viewportSize = {width: jsonData.options.width, height: jsonData.options.height}; 

我做了这几个变化,因为(a)尝试和失败的JSON直接发送到脚本作为参数我看了之后in situations like my own the only way to send JSON to PhantomJS is to save it to a file and then read it和(b)我没有将这个脚本作为另一个JavaScript脚本的模块调用 - 我直接从Ruby调用它 - 这意味着export不适用于我。

在Ruby中,我这样做:

data = {"type" => "PieChart", "options" => {"title" => "Type of Fruit Eaten", "width" => "400", "height" => "300", "is3D" => true, "pieSliceText" => "value"},"columns" => {"Type" => "string", "Eaten" => "number"}, "rows" => {"Bananas" => 4, "Apples" => 2, "Oranges" => 6, "Mangoes" => 3}}.to_json 
require 'tempfile' 
file = Tempfile.new("foo") 
file.write(data) 
file.rewind 
Phantomjs.run("./app/assets/javascripts/googleCharts.js", file.path) 

那么,为什么我收到此错误:

"TypeError: 'undefined' is not an object (evaluating 'jsonData.options.width')\n\n ./app/assets/javascripts/googleCharts.js:43\n" 

BTW,43行(在错误的统称)是:

page.viewportSize = {width: jsonData.options.width, height: jsonData.options.height}; 

当我在TextMate中打开临时文件,它看起来像这样:

{"type":"PieChart","options":{"title":"Type of Fruit Eaten","width":"400","height":"300","is3D":true,"pieSliceText":"value"},"columns":{"Type":"string","Eaten":"number"},"rows":{"Bananas":4,"Apples":2,"Oranges":6,"Mangoes":3}} 

当我把它粘贴到JSONLint,它验证。

为什么我跑在PhantomJS命令行脚本(在该文件的路径粘贴而不是从system.args调用它),我得到这个错误:

'page.viewportSize = {width: jsonData.options.width, height: jsonData.options.height};' is a cyclic structure 

在这一点上,如果我只需键入jsonData.options.width,我得到:

'jsonData.options.width' is a cyclic structure 

如果我只需要输入jsonData,我得到:

undefined 
+0

当提供的数据,给我们最起码的必要证明的问题。更多的东西会浪费空间,并且使其更难处理。 – 2014-11-07 00:16:14

+0

如果使用'file.puts data'而不是'file.write(data)',会发生什么? – 2014-11-07 00:21:32

+0

与'file.write(data)'相同的结果 – 2014-11-07 05:14:28

回答

0

终于搞定了。

的步骤是:

(1)不要改变googleCharts.js(不像什么我上面写的)。相反,您使用googleCharts.js完全按照https://github.com/pstephan1187/PhantomJS-Google-Charts

(2)放置googleCharts。JS在/app/assets/javascripts,除非你想修改下面的代码

(3)从下面的JavaScript脚本中调用googleCharts.js

var GC = require('./googleCharts.js'); 

var system = require('system'); 
var fs = require('fs'); 
var path = system.args[1]; 
var opened = fs.open(path, "r"); 
var data = fs.read(path); 
var jsonData = JSON.parse(data); 

GC.generateChart(jsonData, function(svgHtml){ 
    console.log(svgHtml); 
    phantom.exit(); 
}); 

(4)调用脚本trigger.js,并将其放置在/app/assets/javascripts,除非你想修改下面的代码

(5)安装PhantomJS宝石https://github.com/colszowka/phantomjs-gem

(6)调用一大堆具有以下红宝石:

data = {"type" => "PieChart", "options" => {"title" => "Type of Fruit Eaten", "width" => "400", "height" => "300", "is3D" => true, "pieSliceText" => "value"},"columns" => {"Type" => "string", "Eaten" => "number"}, "rows" => {"Bananas" => 4, "Apples" => 2, "Oranges" => 6, "Mangoes" => 3}}.to_json 
require 'tempfile' 
file = Tempfile.new(['a', '.txt'], "#{Rails.root}/tmp") 
file.write(data) 
File.chmod(444, file.path) 
file.rewind 
Phantomjs.run("./app/assets/javascripts/trigger.js", file.path) 

UPDATE

这里是一个用来展示这一切行动叉:

https://github.com/snoblenet/PhantomJS-Google-Charts-Ruby

相关问题