【问题标题】:Rails JSON not Working in JS FunctionRails JSON 在 JS 函数中不起作用
【发布时间】:2018-03-12 03:09:42
【问题描述】:

我正在尝试从 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 &”或“Uncaught SyntaxError: Unexpected token =>”

我的感觉是它以某种方式没有按照函数期望的方式翻译 JSON。知道如何解决这个问题吗?

【问题讨论】:

  • 不是@screenShareData = JSON.parse(res.body)解析JSON数据并存储为Hash吗?要么根本不解析,要么使用 .to_json 方法将其转换为 JSON。
  • 我的感觉是你的控制器没有收到json 响应,尝试console.log(screenSharedData) 看看你得到了什么。
  • 我也试过不解析它。无济于事。我也得到了一个 json 响应,因为我可以将它和视图中的所有数据显示为字符串。我会看看你链接的问题,Taki,我认为这与下面的回复类似。

标签: javascript ruby-on-rails json


【解决方案1】:

您可以通过修改视图中的变量来传递我从控制器获得的rails JSON变量,如下所示:

<%= @screenShareData.to_json.html_safe %>

之后,screenleap.startSharing 函数接受了数据并开始工作。应该注意的是,我还删除了“callbacks”变量,但我将“screenShareData”变量中的更改隔离为解决问题的变量。

【讨论】:

    【解决方案2】:

    你不能在js代码中使用irb语法

    var screenShareData = <%= @screenShareData %>;
    

    有几个选项可以实现你想要的:

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

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

    更新:我错了,你可以在 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 里面可能有一些代码会在客户端浏览器中执行

    另外我建议您将api.screenleap.com 请求逻辑从控制器操作移动到服务对象。

    如果api.screenleap.com 不可用或响应错误,你会怎么做?

    Net::HTTP::Post 是一个阻塞请求,这意味着如果api.screenleap.com 需要 5 秒来响应,那么您的客户端浏览器渲染将保持 5 秒。我建议你异步执行,除非它想要的行为

    您在同一个操作响应中有不同的数据格式。如果@presentation.presenter.id == current_user.idtrue,那么它是一个数组或一个对象。如果false 那么它的布尔值。这不酷

    【讨论】:

    • 谢谢,我会试一试。请继续关注...至于混乱的格式,我还没有构建出有人访问页面但不是演示者的情况。因此,当我开始构建它时,“else”中的所有内容都只是一个占位符,以避免“未定义变量”错误。它不会是它的最终形式。再次感谢您的建议。
    • 您的第一句话是错误的。您可以在 JS 代码中使用 ERB。
    • @RyanFriedman 感谢您指出这一点。我更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2016-05-12
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多