Я хотел бы, чтобы этот фильтр запускался каждый раз при загрузке страницы (на данный момент), чтобы проверить, старше ли элементу 7 дней или нет, и если да, выполните над ним некоторые действия, чтобы обновить его атрибуты.
У меня есть before_filter :update_it
в контроллере приложений. update_it
определяется ниже, чем в том же контроллере, что и:
def update_it
@books = Book.all
@books.each do |book|
book.update_queue
end
end
Затем в модели книги определяется update_queue
. Вот все в модели, что относится к этому:
scope :my_books, lambda {|user_id|
{:conditions => {:user_id => user_id}}
}
scope :reading_books, lambda {
{:conditions => {:reading => 1}}
}
scope :latest_first, lambda {
{:order => "created_at DESC"}
}
def move_from_queue_to_reading
self.update_attributes(:queued => false, :reading => 1);
end
def move_from_reading_to_list
self.update_attributes(:reading => 0);
end
def update_queue
days_gone = (Date.today - Date.parse(Book.where(:reading => 1).last.created_at.to_s)).to_i
# If been 7 days since last 'currently reading' book created
if days_gone >= 7
# If there's a queued book, move it to 'currently reading'
if Book.my_books(user_id).where(:queued => true)
new_book = Book.my_books(user_id).latest_first.where(:queued => true).last
new_book.move_from_queue_to_reading
currently_reading = Book.my_books(user_id).reading_books.last
currently_reading.move_from_reading_to_list
# Otherwise, create a new one
else
Book.my_books(user_id).create(:title => "Sample book", :reading => 1)
end
end
end
Мои отношения таковы, что книга принадлежит пользователю, а у пользователя есть_много книг. Я показываю эти книги в представлении через пользовательское представление, хотя это не имеет значения.
Итак, ошибки, которые я продолжаю получать, заключаются в том, что move_from_queue_to_reading
и move_from_reading_to_list
являются неопределенными методами. Как это может быть? Я четко определяю их, а затем называю их ниже. Я действительно в недоумении и был бы очень признателен за понимание того, что я делаю неправильно. Я здесь новичок, поэтому любая структурированная критика будет отличной :)
ИЗМЕНИТЬ
Точное сообщение об ошибке, которое я получаю, и трассировка стека выглядят следующим образом:
NoMethodError in UsersController#show
undefined method `move_from_queue_to_reading' for nil:NilClass
app/models/book.rb:41:in `update_queue'
app/controllers/application_controller.rb:22:in `block in update_it'
app/controllers/application_controller.rb:21:in `each'
app/controllers/application_controller.rb:21:in `update_it'
new_book
иcurrently_reading
не являютсяnil
? - person PinnyM   schedule 03.01.2013protected
илиprivate
? - person Don Cruickshank   schedule 03.01.2013new_book
не равен нулю, если я запускаюnew_book = Book.where(:queued => true).last
в консоли. Возвращает книгу. То же самое сcurrently_reading
. - person Trevan Hetzel   schedule 03.01.2013Book.my_books(user_id).where(:queued => true).last
. В любом случае может помочь, если вы опубликуете трассировку стека. - person PinnyM   schedule 03.01.2013my_books
— это область действия. - person Trevan Hetzel   schedule 03.01.2013undefined method
move_from_queue_to_reading' for nil:NilClass` - person PinnyM   schedule 03.01.2013.my_books(user_id)
как-то недействительно. Это найдено выше вscope :my_books
. Эми, я неправильно называю этот метод области видимости? - person Trevan Hetzel   schedule 03.01.2013user_id
в этой модели. Может ли это быть проблема? - person Trevan Hetzel   schedule 03.01.2013user_id
является атрибутом текущего объектаbook
- см. обновление моего ответа. - person PinnyM   schedule 03.01.2013