我如何让Rails与Backbone.js一起使用?

时间:2014-04-18 06:38:02

标签: ruby-on-rails backbone.js

我完成了CodeSchool的Backbone.js课程剖析,并尝试将其与Rails一起使用。

但我不知道为什么它不起作用....

My Backbone.js代码:

var PostModel = Backbone.Model.extend({
    defaults: {
        id: 0,
        title: "",
        content: ""
    }
});

var PostList = Backbone.Collection.extend({
    url: '/posts',
    model: PostModel
});


var PostView = Backbone.View.extend({
    tagName: 'p',
    template: _.template(
        '<h1>' + '<%= title %>' + '</h1>' + '<br />' +
        '<%= content %>'
    ),
    render: function(){
        this.$el.html(this.template(this.model.attributes));
    }
});


var PostIndexView = Backbone.View.extend({
    addOne: function(post){
        var postView = new PostView({model: post});
        postView.render();
        this.$el.append(postView.el);
    },
render: function(){
    this.collection.forEach(this.addOne, this);

}
});

我有一个Pages#Controller(它只有一个索引方法)和一个帖子#Controller。

我将页面#index指定为根路径。页面#index视图如下:

<h1 id="heading">Index Posts</h1>

<div id="posts"></div>

<script type="text/javascript" charset="utf-8">
    var postModel = new PostModel();
    var postList = new PostList({model: postModel});
    postList.fetch();

    var postIndexView = new PostIndexView({collection: postList});

    postIndexView.render();
    $('#posts').html(postIndexView.el);

</script>

帖子#Dedex喜欢这个:

def index
    @posts  = Post.all

    render json: @posts
end

(帖子对象有两个属性,一个是标题,一个是内容。)

我看到来自/ posts路径的回复是:

[{"id":3,"title":"hi","content":"hi","created_at":"2014-04-18T03:50:51.444Z","updated_at":"2014-04-18T03:50:51.444Z"},{"id":4,"title":"post2","content":"post2\r\n","created_at":"2014-04-18T04:07:20.550Z","updated_at":"2014-04-18T04:07:20.550Z"}]

但是每当我使用浏览器访问root_url时,都没有任何反应。

任何人都可以帮助我...谢谢...

更新

我错过了一件没有提及的事情,我看到了以下错误:

在2014-04-19 05:37:52 +0800开始获取127.0.0.1的“/assets/underscore-min.map” ActionController :: RoutingError(没有路由匹配[GET]“/assets/underscore-min.map”):

在2014-04-19 05:37:52 +0800

开始获取127.0.0.1的“/assets/backbone-min.map”

ActionController :: RoutingError(没有路由匹配[GET]“/assets/backbone-min.map”)

2 个答案:

答案 0 :(得分:0)

您是否在backbone.js文件中包含了backbone.js?

有关详细信息,请参阅此slideshow

答案 1 :(得分:0)

您没有看到任何渲染内容,因为渲染功能在获取操作完成之前正在执行。在转移到下一行代码之前,Javascript不会等待异步事件完成。要解决此问题,您需要修改视图以在完成提取操作后调用render()。当提取集合或模型时,它们将触发同步&#39;可以由视图侦听或包含对象的事件。您需要做的就是让视图监听集合的同步事件,然后调用渲染。将以下代码放在视图的初始化函数中以创建此绑定:

this.listenTo(this.collection, "sync", this.render);

此代码将收听同步&#39; this.collection上的事件,然后在触发时调用this.render。

你也可以删除postIndexView.render();来自页面#index视图,因为它实际上没有做任何事情。