2013-03-07 36 views
0

我試圖用rails/ember.js寫一個小博客應用程序。帖子可以被標記(使用acts-as-taggable-on),並且可以通過訪問「/ t /:tag_name」來查看具有特定標籤的所有帖子的列表。我正在使用post_controller.rb的索引動作(如果我沒有弄錯,通過tagged_route.js中的「find」調用)以及當我直接訪問頁面時(例如用「/ t/first」 「)一切工作正常。但是,當我轉到其中一個帖子的頁面並點擊其中一個標籤的鏈接時,ember.js保留在帖子控制器(.js一個)中,同時轉到正確的地址並我收到以下錯誤消息之一:ember.js貌似挑選了一個路線錯誤的控制器

  • 類型錯誤:arrangedContent.addArrayObserver不是一個函數
  • 類型錯誤:content.removeArrayObserver不是一個函數
  • 類型錯誤:要麼(...)objectAt是不是功能

我已經嘗試添加

controllerFor: function() { 
    return EmberBlog.TaggedController; 
} 

到tagged_route.js,但隨後的標籤頁上的帖子列表只保留爲空。 洙,有沒有人有一個想法,我可能會做錯什麼?

這裏是(可能)的相關文件:

我router.js:

EmberBlog.Router.map(function() { 
// default index route to/loading index template 
    this.resource("posts", function() { // implicit path and template name (same as route name) 
    //this.route('new'); 
    }); 
    this.resource('post', { path: '/posts/:post_id' }); 
    this.resource('tagged', { path: '/t/:tag_name' }); 
    this.route("about"); 
}); 

EmberBlog.reopen({ 
    location: 'history' 
}); 

我tagged_route.js:

EmberBlog.TaggedRoute = Ember.Route.extend({ 
    model: function(params) { 
    Em.Logger.info(params); 

    var posts = EmberBlog.Post.find({'tag_name': params.tag_name}); 
    return posts; 
    }//, 
    //controllerFor: function() { 
    // return EmberBlog.TaggedController; 
    //} 
}); 

在我post_controller.rb索引操作:

def index 
    if params[:tag_name] 
    posts = Post.tagged_with(params[:tag_name]) 
    else 
    posts = Post.all 
    end 
    render json: posts, meta: { total: posts.count } 
end 

我tagged.handlebars:

<h2>Tagged Posts</h2> 

<div id="posts"> 
    {{log controller}} 
    <ul> 
    {{#each post in controller}} 
     {{view EmberBlog.PostInListView contentBinding="post"}} //--> <li>{{#linkTo post post}}{{post.title}}{{/linkTo}}</li> 
    {{else}} 
     Sorry, no posts to display 
    {{/each}} 
    </ul> 
</div> 

我post.handlebars的相關部分:

... 
<div class="taglist"> 
    <ul class="inline"> 
    Tags: 
    {{#each tag in tagList}} 
     <li>{{#linkTo tagged tag}}{{tag}}{{/linkTo}}</li> 
    {{else}} 
... 

回答

1

我找到了問題的答案,以this question的幫助。

問題在於linkTo在我的TaggedRoute中沒有觸發模型掛鉤,而TaggedController(ArrayController)試圖使用由linkTo傳遞的字符串。

我解決它通過使一個TaggedController ObjectController與所計算的屬性postsWithTag

EmberBlog.TaggedController = Ember.ObjectController.extend({ 
    content: null, 

    postsWithTag: function() { 
    var posts = EmberBlog.Post.find({'tag_name': this.get('content')}); 
    return posts; 
    }.property('@content') 
}); 

並改變TaggedRoute到

EmberBlog.TaggedRoute = Ember.Route.extend({ 
    model: function(params) { 
    Em.Logger.info(params); 

    var tag = params.tag_name; 
    return tag; 
    } 
}); 

和tagged.handlebars到

<h2>Tagged Posts</h2> 

<div id="posts"> 
    {{log controller}} 
    <ul class="unstyled"> 
    {{#each post in postsWithTag}} 
     {{view EmberBlog.PostInListView contentBinding="post"}} 
    {{else}} 
     Sorry, no posts to display 
    {{/each}} 
    </ul> 
</div>