2012-01-10 243 views
0

我有一個骨幹應用程序,加載後,需要從四個不同的集合(Rails - > JSON後端)獲取數據。骨幹:預取集合

這是服務器的四個命中,我猜有更好的方法。

我開始試圖通過Rails的to_json()查詢結果到了Rails路由器初始化的查看,如:

<script type="text/javascript"> 
    $(function() { 
     window.router = new Backbonedemo.Routers.CalendarsRouter({calendars: [], tasks: <%= @tasks %>}); 
     Backbone.history.start(); 
     }); 
</script> 

但並沒有帶來喜悅。

那麼,在啓動時運行等同於fetch()的正確方法是什麼,而不必爲要收集的每個集合都選擇JSON?

回答

3

退房rabl寶石。它允許你定製你的json響應的程度遠高於常規的to_json將允許的程度。

這裏的設置,你需要提供JSON的負荷了前一個項目一個基本途徑:

首先,設置你的控制器來拉在頁面加載數據,examlpe localhost:3000/home看起來在家裏控制器指數:

class HomeController < ApplicationController 
    def index 
    @user = current_user 
    render 'user.json' # this line is not actually required most of the time when using backbone and proper ajax/json requests 
    end 
end 

接下來,建立一個rabl模板,這需要一個視圖或局部的地方,並返回JSON到客戶端。實際上,我將使用一個部分,使加載到家庭/ index.html的瀏覽好,易於:

# views/home/_user.json.rabl 
object @user 
attributes :id, :first_name, :last_name, :birthdate, :gender, :nickname, :email 
node(:avatar_thumb_url) { |u| u.avatar.url :thumb } 
node(:roles) { |u| u.roles } 
node(:name) { |u| "#{u.first_name} #{u.last_name}".strip } 
node(:errors) { |u| u.errors.to_hash if u.errors.present? } 
child :awesome_calendars => :calendars do 
    attributes :id, :date, :description 
    child :events do 
    attributes :title, :description 
    end 
end 

這是一些比較花哨Rabl的,將提供一堆JSON的,包括相關的一系列記錄,全部在一個JSON對象中。

在加載了骨幹您的HTML視圖,您需要將控制器的對象傳遞給部分:

# views/home/index.html.erb 
<script type='text/javascript'> 
    $(function() { 
     window.router = new Backbonedemo.Routers.CalendarsRouter(<%= render('user.json.rabl', user: @user).html_safe -%>); 
    Backbone.history.start(); 
    }); 
</script> 

要回顧一下:

  1. 控制器再現定期html.erb觀點(即啓動一個up backbone)
  2. 該視圖也呈現部分 - 這部分是rabl模板,嚴格返回JSON
  3. 骨幹採用了這個JSON並用它做任何你想做的事情。

這樣做的好處是,你可以爲你的任何控制器動作設置json.rabl響應,並讓它們返回各種json的東西,所有的控件都可以輕鬆控制。我上面做的事情是「困難」的部分,您希望將來自多個表格的內容加載到您的第一個頁面加載中的單個JSON調用 - 避免多個AJAX /主幹提取請求。

有意義嗎?我希望如此...:/如果有什麼不清楚的話,請告訴我。

1

我不知道Rails的,但看到"bootstrap" example in the Backbone docs

<script> 
    Accounts.reset(<%= @accounts.to_json %>); 
    Projects.reset(<%= @projects.to_json(:collaborators => true) %>); 
</script> 

一般情況下,我認爲你需要創建集合對象,然後reset()他們直列JSON數據。