Backbone и Rails 3 Uncaught TypeError: не удается вызвать метод «on» неопределенного

Я разрабатываю приложение и следую этому приведению рельсов:
http://railscasts.com/episodes/323-backbone-on-rails-part-1

Все кажется правильным, за исключением того, что я продолжаю получать сообщение об ошибке, когда запускаю консоль js на локальном хосте: 3000. Я получаю следующее:

   Uncaught TypeError: Cannot call method 'on' of undefined     posts_index.js:16
   Voice.Views.PostsIndex.PostsIndex.initialize                 posts_index.js:16
   Backbone.View                                                backbone.js:1147
   PostsIndex                                                   posts_index.js:10 
   Voice.Routers.Posts.Posts.index                              posts_router.js:24
   (anonymous function)                                         backbone.js:900
   (anonymous function)                                         backbone.js:1081
   _.some._.any                                                 underscore.js:209
   _.extend.loadUrl                                             backbone.js:1079
   _.extend.start                                               backbone.js:1046
   window.Voice.initialize                                      voice.js:10
   (anonymous function)                                         voice.js:15
   fire                                                         jquery.js:975
   self.fireWith                                                jquery.js:1083
  jQuery.extend.ready                                           jquery.js:407
  DOMContentLoaded                                              jquery.js:84

Вот мой основной код для коллекций, моделей, представлений, маршрутизаторов и шаблонов:

приложение/активы/javascripts/voice.js.coffee

Window.Voice =
    Models: {}
    Collections: {}
    Views: {}
    Routers: {}
    initialize: ->
            new Voice.Routers.Posts()
            Backbone.history.start()
$(document).ready ->
    Voice.initialize()

приложение/активы/javascripts/application.js

//= require jquery
//= require jquery_ujs
//= require underscore
//= require backbone
//= require voice
//= require_tree ../templates
//= require_tree ./models
//= require_tree ./collections
//= require_tree ./views
//= require_tree ./routers
//= require_tree .

javascripts/маршрутизаторы/posts_router.js.coffee

class Voice.Routers.Posts extends Backbone.Router
    routes:
            '': 'index'
    initialize: ->
            @collection = new Voice.Collections.Posts()
            @collection.fetch()
    index: ->
            view = new Voice.Views.PostsIndex()
            $('#container').html(view.render().el)

javascripts/представления/сообщения/сообщения_index.js.coffee

class Voice.Views.PostsIndex extends Backbone.View

    template: JST['posts/index']

    initialize: ->
            @collection.on('reset', @render, this)

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

приложение/активы/шаблоны/сообщения/index.jst.eco

<h1> BACKBONE WORKS</h1>
<tr><td>
<%= @posts %>
</td></tr>

javascripts/коллекции/posts.js.coffee

class Voice.Collections.Posts extends Backbone.Collection
    url: '/api/posts'
    model: Voice.Models.Post

javascripts/модели/post.js.coffee

class Voice.Models.Post extends Backbone.Model

config/routes.rb

Voice::Application.routes.draw do
    match '/login' => 'session#create'
    get 'logout', to: 'session#destroy', as: 'logout'
    resources :users
    scope "api" do
            resources :posts
    end
root :to => "main#index"
end

контроллеры/posts_controller.rb

class PostsController < ApplicationController
  def index
    render :json => Post.all
  end

  def show
    render :json => Post.find(params[:id])
  end

  def upvote
    @post = Post.find(params[:id])
    current_user.like(@post)
    render :json => @post
  end

  def downvote
    @post = Post.find(params[:id])
    current_user.dislike(@post)
    render :json => @post
  end

  def create
    @post = Post.create!(:content => params[:content])
    render :json => @post
  end
end

приложение/представления/основной/index.html.erb

<table class = 'table table-bordered table-condensed table-hover'>
        <div id='container'>
        </div>
</table>

Магистраль трудно отлаживать, и я уже потратил на нее 12+ часов. Кто-нибудь может мне помочь?


person godzilla3000    schedule 23.11.2012    source источник


Ответы (1)


Ваш PostsIndex делает следующее:

initialize: ->
    @collection.on('reset', @render, this)

но вы создаете его следующим образом:

class Voice.Routers.Posts extends Backbone.Router
    #...
    index: ->
        view = new Voice.Views.PostsIndex()

Я думаю, вы хотите передать @collection маршрутизатора PostsIndex:

view = new Voice.Views.PostsIndex(collection: @collection)

Backbone автоматически преобразует эту опцию collection в @collection внутри PostsIndex:

конструктор/инициализировать new View([options])

[...] Есть несколько специальных опций, которые, если они будут переданы, будут прикреплены непосредственно к представлению: model, collection, el, id, className, tagName и attributes.

поэтому достаточно просто включить collection: @collection при построении PostsIndex.

person mu is too short    schedule 23.11.2012