视图中的模型逻辑 - Rails

时间:2016-02-02 09:24:53

标签: ruby-on-rails view

我的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 

4 个答案:

答案 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问题。您正在查询每篇文章的数据库以获取所有评论。这可能会减慢您的系统速度。

我建议采用下一种解决方案。

  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
  2. 在控制器中加载此关系

    class Article < ActiveRecord::Base
        has_one :last_comment, -> { where(created_at: :desc) },  class_name: 'Article'
    end
    
  3. 然后在您的视图中使用下一个代码

    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