我已经在这里看了相当多的其他答案,但我仍然在努力弄清楚如何设置我的Rails小部件。
我的小部件控制器中有以下代码:
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:
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:
<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所做的:
发布于 2015-04-28 00:28:35
我知道问题出在哪里了。我需要向rails控制器和$.ajax方法添加一个回调。我在ajax调用中没有正确设置回调。我还需要指定正确的头(contentType)来避免HTTP406错误。下面是可用的jQuery代码,以供参考:
$(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控制器:
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
https://stackoverflow.com/questions/29868675
复制相似问题