2013-04-24 77 views
3

鑑於控制器MapsController將呈現的HTML,以JSON

class MapsController < ApplicationController 
    def index 
    @campings = Camping.finm(:all) #in reality a much more complex scope. 
    respond_to do |format| 
     format.html 
     format.json { render :json => @campings } 
    end 
    end 
end 

這使得JSON就好了。但現在,我想帶一些HTML傳遞給注入到DOM:

$.ajax({ 
    dataType: "json", 
    url: "maps.json?bounding=45.446465,-4.935988,53.944621,17.036668", 
}).done(function (data) { 
    //... 
    var gInfoWindow = new google.maps.InfoWindow({ 
    content: camping.infowindow 
    }); 
    //... 
    $("#campings").append(camping.listing); 
}); 

這個JavaScript假定.listing.infowindow屬性在返回的每個JSON-對象。它們應該包含使用部分campings/_infowindow.html.hamlcampings/_listing.html.haml呈現的HTML, 。

這是解決這個問題的正確角度嗎?還是應該在JavaScript中構建HTML並避免發送HTML?如果是這樣,是否還有一種方法可以使用partials來構建實際的HTML?

如何將listinginfowindow添加到對象Camping模型沒有這些字段?

回答

1

也許有點粗糙(而不是100%的超級「Rails的路」),但在類似的情況對我工作的罰款:

render :text => {:result => "success", 
       :document_row => render_to_string(
            :file => "admin/documents/_document_row", 
            :formats => "html", 
            :layout => false, 
            :locals => {:documentable => documentable})}.to_json 

所以大概只生成一個散列並使用render_to_string獲得HTML從th _document_row模板。

+0

我不知道這是如何呈現一個集合。在我看來,這需要包裹在一些'.each'或'.map'塊中,而不是? – berkes 2013-04-24 14:47:47

+0

對於你可以使用的集合:集合而不是:locals(假設你的模板是用這種方式編碼的)。但是,是的,你可以先創建一個字符串,並從render_to_string中「收集」幾個結果。 – 2013-04-24 14:51:15

+0

我接受了這個答案,因爲它解釋了「render_to_string」,後者證明是解決我的問題的關鍵。 – berkes 2013-05-01 10:07:17

0

如果您使用類似KnockoutJS或其他JavaScript數據綁定或模板工具,您可以在頁面中有一個框架「模板」開始,當您發出ajax請求時,會在露營列表中填入框架。

它的工作方式是你的桌子或列表或任何野營列表綁定到Knockout模型中的野營對象數組。當你發出你的ajax請求時,你只需用返回的json更新該數組。當該數組更新時,DOM會自動更新以顯示新列表。這可以讓你的ajax請求僅獲取數據,而不是所有的HTML標記,這意味着更少的字節數,並且你可以根據數據分開從更新DOM獲取新數據的行爲。