2015-11-15 9 views
0

Я пытаюсь показать количество элементов массива в представлении индекса моего приложения.. Метод подсчета не работает над приложением Heroku

В контроллере у меня есть следующий код в методе контроллера Update:

def update 
params[:course][:member_ids] ||= [] 
params[:teacher_name] 
params[:attendees] 


@course=Course.find(params[:id]) 
@[email protected] 


@course.update_attribute(:attendance, @count_attendance) 

В представлении я использую следующий, чтобы отобразить количество элементов массива

<td><%= course.attendance %></td> 

Количество показывает на localhost, но при развертывании в heroku я получаю следующую ошибку:

NoMethodError (undefined method `count' for nil:NilClass):

W шляпу я не хватает?

+0

Вы уверены, что ваш «курс» на самом деле имеет «посетителей» в вашей базе данных Heroku? –

ответ

2
undefined method `count' for nil:NilClass 

Это означает, что вы вызываете count на nil объект, который означает, @course.attendees возвращается nil на вашей базе данных Heroku, поэтому, когда вы звоните: @course.attendees.count, он пытается вызвать: nil.count и получить указанную ошибку.

Убедитесь, что у вас есть данные attendees для @course в базе данных героев и повторите попытку. Он должен работать!

Вы можете увидеть, если у вас есть данные в базе данных Heroku, войдя в Heroku Рельсы консоли: heroku run rails console, а затем захватить course, что-то вроде: course = Course.find(123), а затем увидеть, если у вас есть данные attendees для этого конкретного course: course.attendees в heroku db.

Вы также можете использовать try, таким образом ваше приложение не будет вылетать, если он вызывает count на nil объекта:

@course.attendees.try(:count) 
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 

counter_cache

гораздо лучшим решением для этого является 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 

Из документов:

The :counter_cache option can be used to make finding the number of belonging objects more efficient...

With these declarations, asking for the value of @customer.orders.size requires making a call to the database to perform a COUNT(*) query. To avoid this call, you can add a counter cache to the belonging model

-

Причина ваша функциональность работает в разработке, но не продукт ion, является то, что ваше развитие db, вероятно, будет иметь attendees, заполненный соответствующими данными. Heroku использует отдельную базу данных, что означает, что вам необходимо разместить любые ответы nil.

+0

Спасибо! Я закончил тем, что добавил условие, чтобы проверить нуль. Спасибо за предложение counter_cache. Я могу реорганизовать это решение. – Stan

+0

@Stan вместо добавления нулевого условного контролера вы также можете взглянуть на метод try (посмотрите мой обновленный ответ выше). –

Смежные вопросы