我希望在每次加载页面时(现在)运行过滤器以检查项目是否超过 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'