所以,我正在制作一个Items课程,而人们会在评论中包含评分的评论和项目模型中写评论,我写了一个定义的方法,称为' average_rating'通过收集与此项目对应的评论中的所有评级来计算项目的平均评级。 现在我想通过使用这个函数对项目进行排序,但我发现它是一个未定义的函数。 项目型号:
class Item < ActiveRecord::Base
has_many :reviews, dependent: :destroy
belongs_to :category
def average_rating
if self.reviews.size > 0
sprintf('%.2f', self.reviews.average(:rating))
else
'undefined'
end
end
def self.search(query)
where("name like ?", "%#{query}%")
end
def self.top(query)
text= Category.where(name: query).first
where("category_id like ?", "%#{text.id}%")
end
end
项目视图:
<% @items=@items.sort_by{|x,y| x.average_rating <=> y.average_rating } %>
<% @items.each do |item| %>
<div class="item">
<h4>
<%= link_to item.name, item %>
</h4>
<ul>
<li><%= item.description %></li>
<li> <%= item.average_rating %> </li>
</ul>
</div>
<% end %>
错误: 未定义的方法`average_rating&#39;为零:NilClass
答案 0 :(得分:0)
您收到该错误的原因是item
部分nil
为local_items = @items.compact.sort_by{|x,y| x.average_rating <=> y.average_rating }
。你可以这样做,先删除空白/零值,然后对它们进行排序:
local_items = @items.reject { |c| c.blank? }.sort_by{|x,y| x.average_rating <=> y.average_rating }
,或者
local_items
尝试在视图中将局部变量重命名为local_items = @items.compact.sort_by{|x,y| x.average_rating <=> y.average_rating }
,然后循环显示:
<% local_items.each do |item| %>
<div class="item">
<h4>
<%= link_to item.name, item %>
</h4>
<ul>
<li><%= item.description %></li>
<li> <%= item.average_rating %> </li>
</ul>
</div>
<% end %>
然后:
require 'savon'
c = Savon.client(endpoint: "http://www.example.com",
namespace: "urn:ns.example.com",
log: true,
log_level: :debug,
pretty_print_xml: true)
r = c.call(:call,
:message => {
:InquiryParam => [
{"crmParam" => 123,
:attributes! => { "crmParam" => { "name" => "AccountNumber" }}},
{"crmParam" => 456,
:attributes! => { "crmParam" => { "name" => "history" }}}
]
}
答案 1 :(得分:0)
当您在上调用方法的对象为nil
时,会出现此类错误。
我猜您的@items
列表中有一个nil
- 您可以通过调用@items.compact