Problems with engine loading and routes w\ Rails 2.0

I’m trying to map.from_plugin :my_engine in the routes.rb for my
application

The problem appears to be that at the time routes.rb has been processed
the
Engines plugin itself is loaded but my Engine has not.

On line 69 of lib/engines/rails_extensions/routing.rb:

routes_path = Engines.plugins[name].routes_path

Engines.plugins[name] is returning nil for my engine since it hasn’t
been
loaded yet, and it dies trying to call nil.routes_path. Perhaps this
should
raise ArgumentError or something if Engines.plugins[name] is nil…

At the time routes.rb is being processed, there’s only one entry in
Engines.plugins:

#<Engines::Plugin:0x1945934 @public_directory=nil,
@controller_paths=[“app/controllers”, “components”], @loaded=true,
@code_paths=[“app/controllers”, “app/helpers”, “app/models”,
“components”,
“lib”], @name=“engines”,
@directory="/Users/tony/src/clickcaster/vendor/plugins/engines">

Is there some way I can explicitly load my engine in environment.rb
until
this problem can be corrected?

On Dec 11, 2007 9:31 PM, Tony A. [email protected] wrote:

I’m trying to map.from_plugin :my_engine in the routes.rb for my application

The problem appears to be that at the time routes.rb has been processed the
Engines plugin itself is loaded but my Engine has not.

If your plugin hasn’t been loaded yet, are you sure it ever loads?
Routing is not initialized until after all the plugins have been
loaded (see line 105 vs 114 of initializer.rb), so it doesn’t seem to
make sense that your plugin wouldn’t be in the Engines.plugins
structure. Does it definitely have a lib and/or init.rb file?

Regarding your implementation ideas, they would side-step the plugin
loading process. I’d consider making Routes#from_plugin do nothing if
the plugin could not be found, since that would gracefully work as you
removed plugins from config.plugins, but that still wouldn’t help your
problem.

The key here is why your plugin isn’t present in Engines.plugins at
the point the routes file is loaded. Could you pepper the init.rb
files in your app with puts statements so we can trace what’s going
on?

Cheers,

On Dec 12, 2007 2:21 AM, James A. [email protected] wrote:

If your plugin hasn’t been loaded yet, are you sure it ever loads?

Yep. Everything works perfectly except map.from_plugin…

Is it working for other people?

Routing is not initialized until after all the plugins have been

loaded (see line 105 vs 114 of initializer.rb), so it doesn’t seem to
make sense that your plugin wouldn’t be in the Engines.plugins
structure. Does it definitely have a lib and/or init.rb file?

It had a lib but no init.rb. Adding an empty init.rb didn’t fix the
problem.

Regarding your implementation ideas, they would side-step the plugin

loading process. I’d consider making Routes#from_plugin do nothing if
the plugin could not be found, since that would gracefully work as you
removed plugins from config.plugins, but that still wouldn’t help your
problem.

The key here is why your plugin isn’t present in Engines.plugins at
the point the routes file is loaded. Could you pepper the init.rb
files in your app with puts statements so we can trace what’s going
on?

Here’s what I see if I have my workaround in place (just starting
script/console). Added some print statements to initializer.rb too:

$ script/console
Loading development environment (Rails 2.0.1)
load_environment
load_plugins
Engines init.rb called
Engines.init complete
My engine’s init.rb called
initialize_routing
after_initialize

Without the workaround in place:

$ script/console
Loading development environment (Rails 2.0.1)
load_environment
load_plugins
Engines init.rb called
Engines.init complete
/Users/tony/src/clickcaster/vendor/plugins/engines/lib/engines/rails_extensions/routing.rb:69:in
`from_plugin’:NoMethodError: You have a nil object when you didn’t
expect
it!

So it’s dying somewhere in load_plugins, before my engine’s init.rb gets
loaded…

I’ll keep digging…

Or for that matter…

class ActionController::Routing::RouteSet::Mapper
def from_plugin(name)
eval File.read(File.join(RAILS_ROOT,
“vendor/plugins/#{name}/routes.rb”))
end
end

Hi Tony,

Am 12.12.2007 um 03:53 schrieb Tony A.:

Or for that matter…

class ActionController::Routing::RouteSet::Mapper
def from_plugin(name)
eval File.read(File.join(RAILS_ROOT, “vendor/plugins/#{name}/
routes.rb”))
end
end

plugins are allowed to be located in arbitrary subdirectories under
vendor/plugins.

So vendor/plugins/this/is/a/valid/plugin is a valid plugin dir, if
there’s either an init.rb or a lib subdirectory in it.

    def from_plugin(name)

@code_paths=[“app/controllers”, “app/helpers”, “app/models”,

Tony A.
ClickCaster, Inc.
[email protected] _______________________________________________
Engine-Developers mailing list
[email protected]
http://lists.rails-engines.org/listinfo.cgi/engine-developers-rails-engines.org


sven fuchs [email protected]
artweb design http://www.artweb-design.de
grünberger 65 + 49 (0) 30 - 47 98 69 96 (phone)
d-10245 berlin + 49 (0) 171 - 35 20 38 4 (mobile)

Is there any reason why map.from_plugin needs to be any more complex
than
this:

module ActionController
module Routing
class RouteSet
class Mapper
def from_plugin(name)
eval File.read(File.join(RAILS_ROOT,
“vendor/plugins/#{name}/routes.rb”))
end
end
end
end
end

That’s certainly working fine for me for the time being…