Rails JSON无法在JS函数中工作

时间:2018-03-12 03:09:43

标签: javascript ruby-on-rails json

我正在尝试从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。知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您无法在js代码中使用irb语法

var screenShareData = <%= @screenShareData %>;

有几种方法可以实现您的目标:

  1. 在您的控制器操作中使用json进行响应,并通过ajax请求从客户端请求

  2. 在任何html标签data-attribute中呈现此数据@screenShareData,并使用jQuery或vanilla js方法获取

  3. 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 %>
    

    但我不建议这样做因为:

    1. 在某些情况下可能不起作用。例如@screenShareData 有特殊字符等
    2. @screenShareData可能包含一些将在客户端浏览器中执行的代码
    3. 另外,我建议您将api.screenleap.com请求逻辑从控制器操作移动到服务对象。

      如果api.screenleap.com不可用或响应错误,您打算做什么?

      Net::HTTP::Post是阻止请求意味着如果api.screenleap.com需要5秒钟才能响应,那么您的客户端浏览器渲染将保持5秒钟。我建议你做异步,除非它的期望行为

      您在同一操作响应中使用不同的数据格式。如果@presentation.presenter.id == current_user.idtrue,那么它是一个数组或一个对象。如果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;变量作为解决问题的变量。