我正在尝试从rails控制器获取json响应并将其插入到js函数中。我一直在收到错误:
我的控制器
def live #users present or attendees view
@presentation = Presentation.find(params[:secret])
@countdown = @presentation.start - DateTime.now()
#IF A PERSON IS A PRESENTER
if @presentation.presenter.id == current_user.id
@presenter = true
require 'json'
require 'net/http'
require 'uri'
uri = URI.parse('https://api.screenleap.com/v2/screen-shares')
req = Net::HTTP::Post.new(uri.path, initheader = {'accountid' => 'APPID', 'authtoken' => 'MYTOKEN'}) #These are correct in actual code
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
res = http.request(req)
@screenShareData = JSON.parse(res.body)
#IF A PERSON IS AN ATTENDEE
else
@presenter = false
@screenShareData = false
end
end
在我看来
<script>
<script type="text/javascript" src="https://api.screenleap.com/js/screenleap.js"></script>
window.onload = function() {
var callbacks = {
nativeDownloadStarting: [onNativeDownloadStartCallback],
screenShareStarting: [onScreenShareStarting],
appConnectionFailed: [onAppConnectionFailed],
screenShareStartError: [onScreenShareStartError]
};
var screenShareData = <%= @screenShareData %>;
var presenterAppType = 'NATIVE';
screenleap.startSharing(presenterAppType, screenShareData, callbacks);
};
</script>
在我看来,我也尝试过:
var screenShareData = <%= @screenShareData.to_s.html_safe %>;
在任何一种情况下,我似乎都会遇到两个javascript错误之一。 “Uncaught SyntaxError:Unexpected token&amp;”或“Uncaught SyntaxError:Unexpected token =&gt;”
我的感觉是它不会以函数期望的方式翻译JSON。知道如何解决这个问题吗?
答案 0 :(得分:0)
您无法在js代码中使用irb
语法
var screenShareData = <%= @screenShareData %>;
有几种方法可以实现您的目标:
在您的控制器操作中使用json进行响应,并通过ajax请求从客户端请求
在任何html标签data-attribute中呈现此数据@screenShareData
,并使用jQuery或vanilla js方法获取
UPDATE :我错了,你可以在js中注入ruby代码。以下是您的问题的答案:
var screenShareData = JSON.parse("<%= j @screenShareData.to_json.html_safe %>")
j is an alias to escape_javascript。
还有另一种方式:
var screenShareData = <%= raw @screenShareData.to_json.html_safe %>
但我不建议这样做因为:
@screenShareData
有特殊字符等@screenShareData
可能包含一些将在客户端浏览器中执行的代码另外,我建议您将api.screenleap.com
请求逻辑从控制器操作移动到服务对象。
如果api.screenleap.com
不可用或响应错误,您打算做什么?
Net::HTTP::Post
是阻止请求意味着如果api.screenleap.com
需要5秒钟才能响应,那么您的客户端浏览器渲染将保持5秒钟。我建议你做异步,除非它的期望行为
您在同一操作响应中使用不同的数据格式。如果@presentation.presenter.id == current_user.id
是true
,那么它是一个数组或一个对象。如果false
那么它的布尔值。那不太酷
答案 1 :(得分:0)
您可以通过修改视图中的变量来传递我从控制器获得的rails JSON变量,如下所示:
import csv
import itertools
with open('test_in.csv') as in_fp:
reader = csv.reader(in_fp)
for date, row_iter in itertools.groupby(reader, key=lambda row: row[0]):
out_filename = date.replace('/','-') + '.csv' # todo: name your output file
with open(out_filename, 'w') as out_fp:
csv.writer(out_fp).writerows(row_iter)
之后,screenleap.startSharing函数接受了数据并正常工作。应该注意的是,我还删除了&#34;回调&#34;变量,但我隔离了&#34; screenShareData&#34;变量作为解决问题的变量。