将多个对象传递给Rails 4中的Backbone View

时间:2013-12-19 05:39:57

标签: ruby-on-rails json backbone.js coffeescript

在观看Ryan Bates Railscast之后尝试选择Backbone并且我不确定如何从我的Rails控制器传递多个实例变量并在我的Backbone视图中渲染它们。任何帮助将不胜感激。我试过像:

respond_with({ photos: @photos, feature: @feature, only: @categories })

但我不确定如何在Backbone视图中传递它们。

class PhotosController < ApplicationController
  respond_to :html, :json

  def index      
    photo   = Five00px::Photo.new("jfvYEpvJLv06t0blEKNPuJyU3vjqQP6vnXh6KX3O")
    options = { 
      consumer_key: photo.consumer.key,
      feature: params["feature"] ? params["feature"] : "popular",
      image_size: 2 }

    @photos     = photo.photo_stream(options).photos
    @feature    = photo.stream_feature
    @categories = photo.stream_categories

    respond_with @photos
  end
end

路由器:

class Five00.Routers.Photos extends Backbone.Router

  routes:
    "" : "index"

  initialize: ->
    @collection = new Five00.Collections.Photos()
    @collection.fetch()

  index: ->
    photo_view = new Five00.Views.PhotosIndex(collection: @collection)
    $("#photos").html(photo_view.render().el)

查看:

class Five00.Views.PhotosIndex extends Backbone.View

  template: JST['photos/index']

    initialize: ->
      @collection.on("sync", @render, this)

    render: ->
      $(@el).html(@template(photos: @collection))
      this

1 个答案:

答案 0 :(得分:0)

我认为您误解了您可能期望Backbone应用程序如何工作。如果考虑在索引操作中创建的实例变量,那些通常用作视图中的可访问对象。对于Backbone应用程序,一旦呈现视图,您将只能访问呈现视图时的数据。类似的东西:

<script><%= "window.categories = JSON.parse(#{@categories.to_json});" %></script>

一种方法是让您的照片模型在您进行查询时包含其他关系:

Photo.includes(:categories)

并指定您希望序列化照片的方式:https://github.com/rails-api/active_model_serializers因为您想要的是骨干集合从浏览器提取到资源,也就是使用Photo #index动作中的JSON响应。

或者最后,通过Backbone完全处理这个问题,并为每个资源创建三个单独的请求,并通过模型和集合类在前端组装关系。您可以手动设置这些关系,也可以使用扩展主干库来执行此操作,以获取您可能会看到http://backbonerelational.org/的想法。