Forum: Ruby on Rails Strange rake error with config.cache_classes

F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-01-31 03:50
(Received via mailing list)
when i run rake tasks, i run into a strange problem when running it in
production mode. it loads all of the files in the directory app/
runners/cron. when i run the rake task with config.cache_classes set
to true (as it is set in environment/production.rb) then it seems to
load those files in that directory upon execution of the rake command.
however, those files are not loaded when it is set to false.

i have checked my application, boot, and environment files and i am
not loading that directory.

i came across this error trying to run a thinking_sphinx rake task as
below:

http://groups.google.com/group/thinking-sphinx/bro...
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2011-01-31 10:28
(Received via mailing list)
On Mon, Jan 31, 2011 at 3:48 AM, tashfeen.ekram
<tashfeen.ekram@gmail.com> wrote:

> when i run rake tasks, i run into a strange problem when running it in
> production mode. it loads all of the files in the directory app/
> runners/cron. when i run the rake task with config.cache_classes set
> to true (as it is set in environment/production.rb) then it seems to
> load those files in that directory upon execution of the rake command.
> however, those files are not loaded when it is set to false.
>
> i have checked my application, boot, and environment files and i am
> not loading that directory.

Can you reproduce it in a minimal application?

I see from the other thread that the application runs Rails 3. Just in
case it was migrated from Rails 2 let me comment that in Rails 2
custom directories under app are not eager loaded, while they are in
Rails 3. In case it rings a bell.

Having said that, eager loading is not triggered for bare rake tasks
that do not depend on the builtin :environment task. And for tasks
that do depend there's a global flag called $rails_rake_task set to
true within :environment that prevents eager loading from being run at
all. Thus, as far as rake tasks is concerned, it shouldn't happen *in
any case* unless there's some custom behavior somewhere.
F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-01-31 20:47
(Received via mailing list)
So, based on what you are saying, these must be loaded somehow from a
custom load that I added?

The thing I find confusing though is that should not the same thing
happen even if classes are not cached?

Are there any other files I should look at to track down where this
include might be coming from?

Finally, where is the ideal place to put custom files?

Thanks for you help. :)
F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-01-31 20:48
(Received via mailing list)
Oh, will get back to you on whether this can be reproduced on a
minimal app...
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2011-02-01 08:39
(Received via mailing list)
On 31 Jan 2011, at 19:46, "tashfeen.ekram" <tashfeen.ekram@gmail.com>
wrote:

> So, based on what you are saying, these must be loaded somehow from a
> custom load that I added?
>
> The thing I find confusing though is that should not the same thing
> happen even if classes are not cached?
>
class_caching is the thing that triggers whether application classes
should be automatically loaded.

> Are there any other files I should look at to track down where this
> include might be coming from?
>

I'd double check nothing is playing with eager_load_paths (which is
those paths to be loaded ahead of time)

Fred
F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-02-02 03:29
(Received via mailing list)
is there a way to output the eager_load_path?

i added the following line to one of the files that is mistakely
loaded:

    puts @eager_load_paths

However, the output is nil. does this mean nothing is being eagerly
loaded?

On Feb 1, 2:36am, Frederick Cheung <frederick.che...@gmail.com>
F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-02-05 18:51
(Received via mailing list)
I am still struggling with this. Any idea how I can figure out load
paths?
F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-02-05 19:03
(Received via mailing list)
Also, when I run the below rkae command that is run in the production
environment I do not get the same error.

rake db:migrate RAILS_ENV=production

Should the above command also be caching the classes and cause me to
surface the same problem?
F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-02-05 20:41
(Received via mailing list)
finally figured it out. it is a features of rails 3.0.

http://edgeguides.rubyonrails.org/configuring.html

"config.eager_load_paths accepts an array of paths from which Rails
will eager load on boot if cache classes is enabled. Defaults to every
folder in the app directory of the application. All elements of this
array must also be in load_paths."
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2011-02-05 21:19
(Received via mailing list)
On Sat, Feb 5, 2011 at 8:39 PM, tashfeen.ekram
<tashfeen.ekram@gmail.com> wrote:

> finally figured it out. it is a features of rails 3.0.
>
> http://edgeguides.rubyonrails.org/configuring.html
>
> "config.eager_load_paths accepts an array of paths from which Rails
> will eager load on boot if cache classes is enabled. Defaults to every
> folder in the app directory of the application. All elements of this
> array must also be in load_paths."

Yes, I commented it above.

But eager loading does NOT happen on rake tasks no matter the
environment.
F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-02-05 23:33
(Received via mailing list)
Ahhh. Now, I understand your comment but this also confuses me.

1. rake thinking_sphinx:configure
no prob

2. rake thinking_sphinx:configure RAILS_ENV=production
problem

3. rake db:migrate
no prob

4. rake db:migrate RAILS_ENV=production
no prob

I guess I am confused why the same problem would not surface when
running command 4. Also, I can run command 2 and change in
environments/production.rb cache_classes to false (rather than the
default of true) and then the problem goes away.

It seems like changing cache_classes should not change rake behavior??
Or is there some condition in the rest of the app that is including it
based on whether classes are or not cached?
F9264303ef2808a8b05ff3e63cbc9459?d=identicon&s=25 tashfeen.ekram (Guest)
on 2011-02-06 03:12
(Received via mailing list)
I created a basic app with nothing else except a gem file and those
files being loaded in the "app/runners/cron" directory and it does
appear to reproduce the error.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2011-02-06 12:43
(Received via mailing list)
On Sat, Feb 5, 2011 at 11:32 PM, tashfeen.ekram
<tashfeen.ekram@gmail.com> wrote:

>
> 4. rake db:migrate RAILS_ENV=production
> no prob
>
> I guess I am confused why the same problem would not surface when
> running command 4.

If you define a rake task that depends on the :environment builtin
task no eager loading is triggered.

> Also, I can run command 2 and change in
> environments/production.rb cache_classes to false (rather than the
> default of true) and then the problem goes away.

Because cache_classes is a necessary condition for eager loading. If
you set cache_classes to false no eager loading will happen (unless
forced of course).

But it is not a sufficient condition: even if cache_classes is true,
db:migrate and friends won't trigger eager loading.

Could you come up with a self-contained minimal application that
reproduces the issue? Eg, an application with one exact model and one
exact file in app/runners/cron or whatever and the plugin installed
under vendor. Put

    puts "loading #{__FILE__}"

at the top of each of them. Then two one-liners that demonstrate the
problem.

If you upload a tarball with that I'll have a look at it.
4f24b7c26213fedae0fddec6e438b6dc?d=identicon&s=25 Jesse S. (jesse_s)
on 2011-08-12 19:27
I've run into a similar issue where a variable contained nil when it
should always be an array (the controller ensures this, the view is
where the error was raised.)

Anyways, setting "config.eager_load_paths = false" appears to fix the
issue which only occurs when "config.cache_classes = true". It seems
eager loading has to do with using :include in a find query, taking out
all such includes fixed the problem for me.
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.