2013-04-24 80 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获取新数据的行为。