我的Article
模型的has_many
模型Comment
个实例,其text
属性。
但是,在我看来,当我通过迭代调用article.comments.last.text
时,我收到undefined method
错误。
我必须说,当我通过控制台调用它时,确实会返回文本属性。
日志对此错误的唯一相关响应是:
ActionView::Template::Error (undefined method `text' for nil:NilClass):
查看代码:
- @articles.each do |article|
.article
%comment= article.comments.last.text
答案 0 :(得分:3)
将您的观看代码更新为以下内容。我希望它适合你。
- @articles.each do |article|
.article
%comment= article.comments.last.try(:text)
答案 1 :(得分:1)
在尝试这样的事情时,你应该做一些防御性编码。 article.comments.last.text
。当article.comments
为空时,总会有可能。当你执行.last.text
之类的东西时,它会返回一个空数组[]。它会打破代码抛出错误。
您可以查看article.comments.present?
之类的内容,然后访问上一条评论。
答案 2 :(得分:1)
首先要提到的是,您在此处遇到N+1问题。您正在查询每篇文章的数据库以获取所有评论。这可能会减慢您的系统速度。
我建议采用下一种解决方案。
在angular.module('app').directive('favoritesList', function () {
return {
restrict: 'E',
replace: true,
templateUrl: 'templates/directives/favoritesListDirective.html',
controller: function ($scope, $rootScope, $rootElement, $filter, ContactService, ContactFollowerService, Restangular) {
var listLimit = 100, // in order to prevent favoritesList *overflow*
followedFilter = {filters: {followed: true}, page_size:listLimit};
// get Favorites List
ContactService.provider.getList( followedFilter ) //
.then(function(result){
$scope.favorites=result;
}, function(message){
console.warn('Cannot get a Favorites List',message);
});
....
}
};
});
Article
在控制器中加载此关系
class Article < ActiveRecord::Base
has_one :last_comment, -> { where(created_at: :desc) }, class_name: 'Article'
end
然后在您的视图中使用下一个代码
def your_action
# you can continue querying as I show you with 'where' and 'your_scope', the 'includes' is a must to
@articles = Article.includes(:last_comment).where(...).your_scope
...
end
答案 3 :(得分:1)
要添加到接受的答案,问题定义为错误:
-
nil:NilClass
的未定义方法`text'
这意味着您在text
/ class
/ variable
上拨打了data-set
,但未填充(nil
)。
如上所述,这样做的方法是评估文章是否有.comments
。虽然.try(:x)
是最好的方法,但更简洁的方法是使用条件逻辑:
%comment= article.comments.last.text if article.comments.any?
-
它确实返回文本属性
可能comment
存在,但它与article
无关。
仅调用article.comments
会调用与comments
相关联的article
(通过各自的foreign keys)。如果comment
未与article
相关联,则它不会显示在集合中。
因此,如果您要检查评论是否存在text
,您还需要确保评论与article
相关联。一种简单的方法是通过Rails控制台:
$ rails c
$ article = Article.first
$ comment = Comment.first
$ article.comments << comment