Interesting Class variable problem

class PostOfTheDay private

def self.current_day DateTime.now.utc.to_date end

@@current_post = nil @@current_day = current_day

def self.get_random_post posts = Post.all

posts[rand(posts.size)]

end

public

def self.fetch if @@current_post.nil? || @@current_day != current_day @@current_post = get_random_post @@current_day = current_day end

return @@current_post

end end

I would expect the class variables @@current_post and @@current_day to never change when not accessed. However, in development mode, on each request, a different Post is returned because either the Klazz has been garbage collected (?) or the initializers

@@current_post = nil @@current_day = current_day

have been re-run. But isn’t it required to initialize a class variable before usage?

Why is this the default behaviour? Any pointers on a different approach?

class PostOfTheDay private

def self.current_day DateTime.now.utc.to_date end

@@current_post = nil @@current_day = current_day

def self.get_random_post posts = Post.all

posts\[rand\(posts\.size\)\]

end

public

def self.fetch if @@current_post.nil? || @@current_day != current_day @@current_post = get_random_post @@current_day = current_day end

return @@current\_post

end end

I would expect the class variables @@current_post and @@current_day to never change when not accessed. However, in development mode, on each request, a different Post is returned because either the Klazz has been garbage collected (?) or the initializers

In development mode classes are cleaned out and loaded from scratch on each request (this is why you don't need to restart the server to see changes. In production this isn't true.

Fred

Thanks, I just read http://www.ruby-forum.com/topic/133234 which is also very clear.

I’ll just store that Post of the Day inside an ActiveRecord model.