我已經看過不少其他的答案,但我仍在努力研究如何設置Rails部件。Rails使用jsonp渲染部分作爲ajax的部件
我有我的小部件控制器驗證碼:
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
方法只是設置的是那些獲得傳遞給局部變量列表。
我想要做的是給用戶一個Javascript腳本標籤,他們可以在他們的(外部)網站上嵌入。當用戶點擊該頁面時,腳本將對窗口小部件控制器進行AJAX調用,並且如果該窗口小部件處於打開狀態,它將接收到一個要在頁面上呈現的html字符串。
到目前爲止,我已經得到了widget控制器返回一個json對象的狀態和html字符串。問題是當我將本地主機url粘貼到jsonlint.com時,它說它是無效的。當我在html文件中插入腳本標籤,然後在Chrome中打開它時,也會確認這一點。我收到一個錯誤,說有一個unexpected token :
。於是我改變了我的控制器和widget.js.erb以包含一個回調函數。我將, callback: params[:callback]
添加到我的控制器。
我還在我的widget.js.erb文件中設置了一個回調函數(不做任何事情)。然後,我使用HTML文件中的腳本標記嵌入此文件,並在Chrome中加載該文件。當我這樣做時,我收到一個錯誤,說明showWidget
未定義。
我很努力地找到解釋如何從rails應用程序通過jsonp加載數據的資源,以及回調函數如何發揮作用。
這裏是我的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: