我正在尝试在我的应用的索引视图中显示数组项的计数。
在控制器中,我在控制器更新方法中有以下代码:
def update
params[:course][:member_ids] ||= []
params[:teacher_name]
params[:attendees]
@course=Course.find(params[:id])
@count_attendance=@course.attendees.count
@course.update_attribute(:attendance, @count_attendance)
在视图中,我使用以下内容显示数组元素的数量
<td><%= course.attendance %></td>
计数显示在localhost上但是当部署到heroku时,我收到以下错误:
NoMethodError(未定义的方法`count&#39; for nil:NilClass):
我错过了什么?
答案 0 :(得分:2)
undefined method `count' for nil:NilClass
这意味着,您在count
对象上调用nil
,这意味着@course.attendees
正在您的heroku数据库上返回nil
,因此当您致电:{{1它试图调用:@course.attendees.count
并得到上述错误。
确保您的heroku数据库中有nil.count
的{{1}}数据,然后重试。它应该工作!
您可以通过登录heroku rails console attendees
来查看heroku数据库中是否有数据,然后抓住@course
,例如:heroku run rails console
,然后查看是否您拥有heroku数据库中特定course
:course = Course.find(123)
的{{1}}数据。
您还可以使用try,这样一来,如果某个attendees
对象上的course
调用了该应用,那么该应用就不会崩溃:
course.attendees
答案 1 :(得分:1)
正如K M Rakibul Islam
所解释的那样,您的问题是您在未定义的变量(.count
)上调用@course.attendees
。
-
修复 - 根据此答案:ActiveRecord: size vs count - 可以使用size
代替count
:
@count_attendance = @course.attendees.size
如果这仍然返回相同的错误,您将要使用一些条件代码,以确保您只在attendees
上调用方法(如果存在):
def update
@course = Course.find params[:id]
@course.update attendance: @count.attendees.size if @count.attendees.any?
end
很多更好的解决方案是Rails的counter_cache
functionality:
#app/models/attendee.rb
class Attendee < ActiveRecord::Base
belongs_to :course, counter_cache: :attendance
end
#app/models/course.rb
class Course < ActiveRecord::Base
has_many :attendees
end
来自文档:
:counter_cache
选项可用于更有效地查找归属对象的数量......使用这些声明,要求
@customer.orders.size
的值需要调用数据库来执行COUNT(*)
查询。要避免此调用,您可以向所属模型添加计数器缓存
-
您的功能在开发中运行而非生产的原因是您的开发db
可能会attendees
填充相关数据。 Heroku使用单独的数据库,这意味着您必须适应任何nil
响应。