Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Backbone.js集合url_Ruby On Rails 3_Backbone.js - Fatal编程技术网

Ruby on rails 3 Backbone.js集合url

Ruby on rails 3 Backbone.js集合url,ruby-on-rails-3,backbone.js,Ruby On Rails 3,Backbone.js,我正在使用rails api开发一个backbone.js应用程序,该应用程序提供json,如图所示: [{ "title": "Da vinci Code", "price": "50" }, { "title": "Some other name", "price": "45" }], 待办事项: 当用户访问url“www.backboneapp.com/authors/1”时,它应该显示属于作者

我正在使用rails api开发一个backbone.js应用程序,该应用程序提供json,如图所示:

   [{
        "title": "Da vinci Code",
        "price": "50"
    },
    {
        "title": "Some other name",
        "price": "45"
    }],
待办事项:

  • 当用户访问url“www.backboneapp.com/authors/1”时,它应该显示属于作者的书籍列表
  • 进展: -服务器端Rails[authorscontroller#show]

    def show
      @author = Author.find(params[:id])
      @books  = @author.books
      respond_to do |format|
        format.json { render :json => @books }
        format.html
      end
    end
    
    2.Client-side-Backbone.js

    路由器:

    routes: {
      'authors/:id': 'showauthor'
    },
    
    showauthor: function(id) {
    
      $('#container').empty();
      window.available_books = new AvailableBookList({
        id: id
      });
    
      this.availablebooklistview = new AvailableBookListView({
        id: id,
        collection:  available_books
      });
    
      $('#container').append(this.availablebooklistview.render().el);
    }
    
    可用电子书列表集合:

    AvailableBookList = Backbone.Collection.extend({
      model: AvailableBook,
      url: "/authors/" + this.id  
    })
    
    视图部分:

    $(document).ready(function(){
    
    AvailableBookListView = Backbone.View.extend({
      tagName:   'section',
      className: 'availablebooklist',
    
      initialize: function() {
        _.bindAll(this, 'render');
        this.collection.bind('reset', this.render);
      },
    
      render: function() {
        this.collection.each(function(available_book) {
          var view = new AvailableBookView({
             model: available_book,
          });
    
          this.$('.availablebooklist').append(view.render().el);
        });
        return this;
      }
    });
    
    });
    
    问题:当我访问“www.backboneapp.com/authors/1”时,我发现404错误。 在console.log中显示: 获取:www.backboneapp.com/authors/undefined

    在Rails日志中:
    参数{id=>undefined}

    *我哪里做错了*


    非常感谢您提供的任何帮助和建议

    我假设您不是指路由器中的
    新作者列表
    ,而是
    新的可用电子书列表

    您的收藏中有两个问题:

    AvailableBookList = Backbone.Collection.extend({
      model: AvailableBook,
      url: "/authors/" + this.id  
    })
    
  • 在url的定义中,
    指的是
    窗口
    对象
  • 您在构造函数中传递的
    id
    参数未应用于集合实例。它仅适用于视图(不适用于模型或集合)
  • 要解决第一个问题,可以使用函数定义集合url,这将使您处于正确的范围内:

    AvailableBookList = Backbone.Collection.extend({
      model: AvailableBook,
      url: function() {
        return "/authors/" + this.id;
      }
    });
    
    对于第二个,您可以定义一个
    initialize
    函数,并在其中设置
    id
    属性:

    AvailableBookList = Backbone.Collection.extend({
      initialize: function(models, options) {
        this.id = options.id;
      },
      model: AvailableBook,
      url: function() {
        return "/authors/" + this.id;
      }
    });
    
    为了便于阅读,我还建议将
    id
    重命名为
    author\u id

    AvailableBookList = Backbone.Collection.extend({
      initialize: function(models, options) {
        this.author_id = options.author_id;
      },
      model: AvailableBook,
      url: function() {
        return "/authors/" + this.author_id;
      }
    });
    
    更新

    您还以错误的方式初始化了集合。根据,构造函数签名是
    模型,选项

    window.available_books = new AvailableBookList(null, {
      id: id
    });
    

    initialize:function(models,options){this.id=options.id);}
    中,我无法读取未定义的属性'id',即使作者id解决方案也给了我相同的错误<代码>初始化:函数(选项){this.id=options.id;},这是有效的…但是我仍然得到相同的错误,无法读取未定义的属性'id',我很高兴它有效。同样感谢您的跟进,从回答者的角度来看,他们也很受欢迎。