2012-01-10 1 views
0

로드 할 때 네 가지 콜렉션 (Rails -> JSON 백엔드)에서 데이터를 가져와야하는 백본 어플리케이션이 있습니다.백본 : 프리 페칭 콜렉션

서버에 4 개의 히트가 있으며 더 좋은 방법이 있다고 생각합니다.

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

만이 그 기쁨을 가져 없습니다 :

내가 레일의 라우터 초기화에 쿼리 결과의() 레일을 to_json을 전달하는 시도하여 시작과 같은 볼 수 있습니다.

그래서 수집 할 컬렉션마다 JSON을 누르지 않고 fetch()를 시작할 때 올바른 방법은 무엇입니까?

답변

3

rabl 보석을 확인하십시오. 이 기능을 사용하면 일반적인 to_json보다 훨씬 큰 정도로 json 응답을 사용자 정의 할 수 있습니다.

첫째, examlpe localhost:3000/home 페이지로드 데이터를 뽑아 컨트롤러를 설정 가정에서 보일 것이다

다음은 앞까지 JSON의 부하를 제공하는 데 필요한 프로젝트를 설정하는 기본 방법 컨트롤러 지수 :

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 

다음으로,이 뷰 또는 부분의 발생하고 클라이언트에 JSON을 반환하는 rabl 템플릿을 설정합니다. 나는 실제로 집에로드를 만들기 위해,/index.html을보기 부분을 사용하는거야 쉽고 좋은 :

의 관련 세트를 포함, JSON의 무리를 제공하는 몇 가지 상대적으로 화려한 rabl있어
# 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 

레코드를 모두 하나의 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보기 (시작 하나를 렌더링 위로 백본)
  2. 해당 뷰는 부분 렌더링도합니다.이 부분은 rabl 엄격하게 반환하는 템플릿입니다. JSON
  3. 백본은 JSON을 사용하고 원하는대로 수행합니다.

이것의 장점은 컨트롤러 동작에 대해 json.rabl 응답을 설정하고 쉽게 제어 할 수있는 다양한 json 항목을 반환하도록 할 수 있다는 것입니다. 위에서 수행 한 작업은 많은 테이블의 항목을 페이지의 첫 번째 페이지로드에서 단일 JSON 호출로로드하려는 "어려운"부분입니다. 여러 AJAX/백본 가져 오기 요청을 피하십시오.

의미가 있습니까? 나는 그렇게 희망한다. :/불명확 한 것이 있으면 알려주지.

1

내가 레일 모르겠지만 "bootstrap" example in the Backbone docs 참조 :

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

을 일반적으로, 나는 그들 인라인 JSON 데이터와 다음 reset(), 당신이 컬렉션 개체를 만들 필요가 있다고 생각합니다.