Я разрабатываю приложение и следую этому приведению рельсов:
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+ часов. Кто-нибудь может мне помочь?