首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails使用jsonp在ajax上将部分呈现为小部件

Rails使用jsonp在ajax上将部分呈现为小部件
EN

Stack Overflow用户
提问于 2015-04-26 01:52:31
回答 1查看 557关注 0票数 0

我已经在这里看了相当多的其他答案,但我仍然在努力弄清楚如何设置我的Rails小部件。

我的小部件控制器中有以下代码:

代码语言:javascript
运行
复制
  def widget
    status = Company.friendly.find(params[:id]).widget.active
    body = to_json_value(render_to_string('companies/_widget', locals: { profile: self.profile }))

    respond_to do |format|
      format.js { render json: { status: status, html: body }, callback: params[:callback] }
    end
  end

  private

  def to_json_value(str)
    str.gsub!("\"", "\\\"")
    str.gsub!(/\n+/, " ")
    str
  end

self.profile方法只是设置一个传递给partial的变量列表。

我想要做的是给用户一个Javascript脚本标签,他们可以嵌入到他们的(外部)网站上。当用户点击该页面时,脚本将对小部件控制器进行AJAX调用,如果小部件已打开,它将接收要在页面上呈现的html字符串。

到目前为止,我已经让小部件控制器返回一个带有状态和html字符串的json对象。问题是,当我将本地主机url粘贴到jsonlint.com中时,它显示无效。当我在html文件中插入一个脚本标签,然后在Chrome中打开它时,也会确认这一点。我收到一个错误,说有一个unexpected token :。因此,我更改了控制器和widget.js.erb,以包含一个回调函数。我将, callback: params[:callback]添加到我的控制器中。

我还在widget.js.erb文件中设置了一个回调函数(还没有做任何事情)。然后,我使用脚本标签将该文件嵌入到html文件中,并将其加载到Chrome中。当我这样做的时候,我得到一个错误,告诉我showWidget是未定义的。

我正在努力寻找资源来解释如何通过jsonp从rails应用程序加载数据,以及回调函数是如何发挥作用的。

这是我的widget.js.erb:

代码语言:javascript
运行
复制
function showWidget();

$.ajax({
  type: 'GET',
  url: 'http://localhost:3000/<%= params[:company] %>/widget?callback=?',
  jsonpCallback: 'showWidget',
  contentType: "application/json",
  crossDomain: true,
  dataType: 'JSONP',
  success: function (data) {
    var result = JSON.parse(data);
    $('#company-widget').html(result.html);
  },
  error: function(e) {
    console.log(e.message);
  }
});

这是我的test.html:

代码语言:javascript
运行
复制
<div id="company-widget"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js" type="text/javascript"></script>
<script src="http://localhost:3000/taco-corp/widget.js?callback=showWidget" type="text/javascript"></script>

我也不确定这个widget.js.erb脚本应该放在我的rails应用程序中的什么位置。这是我到目前为止为我的widget.js.erb所做的:

EN

回答 1

Stack Overflow用户

发布于 2015-04-28 00:28:35

我知道问题出在哪里了。我需要向rails控制器和$.ajax方法添加一个回调。我在ajax调用中没有正确设置回调。我还需要指定正确的头(contentType)来避免HTTP406错误。下面是可用的jQuery代码,以供参考:

代码语言:javascript
运行
复制
$(document).ready(function(){
    var company = 'taco-corp';

    $.ajax({
        type: 'GET',
        url: 'http://localhost:3000/' + company + '/widget.js?callback=?',
        contentType: "application/javascript",
        crossDomain: true,
        dataType: 'JSONP',
        success: function(data) {
            $('#company-widget').html(data.html);
        },
        error: function(e) {
            console.log(e.message);
        }
    });
});

下面是我的rails控制器:

代码语言:javascript
运行
复制
  def widget
    status = Company.friendly.find(params[:id]).widget.active

    body = render_to_string('companies/_widget', layout: false, locals: { profile: self.profile })

    respond_to do |format|
      format.js { render json: { status: status, html: body }, callback: params[:callback] }
    end
  end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29868675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档