我有一个骨干应用程序,在加载时需要从四个不同的集合中获取数据(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?
答案 0 :(得分:3)
查看rabl宝石。它允许您以比常规to_json
允许的更大的程度自定义您的json响应。
这是设置项目的基本方法,您需要预先提供大量JSON:
首先,设置控制器以在页面加载时提取数据,因为检查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返回给您的客户端。我实际上将使用partial,以便在home / 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>
回顾一下:
html.erb
视图(启动主干的视图)rabl
模板,严格返回JSON 这样做的好处是,您可以为任何控制器操作设置json.rabl响应,并让它们返回各种json内容,这些内容都很容易控制。我在上面做的是“困难”的部分,你想要将许多表中的东西加载到第一个页面加载的单个JSON调用中 - 避免多个AJAX /骨干提取请求。
有意义吗?我希望如此......:/如果有什么不清楚,请告诉我。
答案 1 :(得分:1)
我不知道Rails,但请参阅"bootstrap" example in the Backbone docs:
<script>
Accounts.reset(<%= @accounts.to_json %>);
Projects.reset(<%= @projects.to_json(:collaborators => true) %>);
</script>
通常,我认为您需要创建集合对象,然后reset()
使用内联JSON数据。