首页 > 解决方案 > nil 的未定义方法“round”:动作索引中的 NilClass

问题描述

我是一个新的 Rails 正在尝试在操作索引页面中使用 Rating Star 但我收到了这个错误

def index
  @listings = Listing.all.order("created_at desc")
end

def show
  impressionist(@listing, nil, { unique: [:session_hash] })
  @reviews =  @listing.reviews.order("created_at DESC")
  unless @reviews.present?
    @avg_review = 0
  else
    @avg_review = @reviews.average(:rating).present? ? @reviews.average(:rating).round(2) : 0
  end
end

HAML 代码在行动索引页面

.geodir-category-options.fl-wrap
  .listing-rating.card-popup-rainingvis.star-rating{"data-score" => "#{listing.reviews.average(:rating).round(2)}"}
    %span{style: "float:right"}
      =listing.reviews.count                        

标签: ruby-on-railsruby-on-rails-5ruby-on-rails-5.2

解决方案


在您的 index.html.haml 中,您还应该过滤您在控制器中显示的方法中所做的事情,而不是:

listing.reviews.average(:rating).round(2)

它应该是:

listing.reviews.average(:rating).present? ? listing.reviews.average(:rating).round(2) : 0

完整代码:

.geodir-category-options.fl-wrap
  .listing-rating.card-popup-rainingvis.star-rating{"data-score" => "#{listing.reviews.average(:rating).present? ? listing.reviews.average(:rating).round(2) : 0}"}
    %span{style: "float:right"}
      =listing.reviews.count      

推荐阅读