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 12.12.2007 18:20
on 12.12.2007 20:34
On Dec 11, 2007 9:31 PM, Tony Arcieri <tony@clickcaster.com> 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 12.12.2007 20:45
On Dec 12, 2007 2:21 AM, James Adam <james.adam@gmail.com> 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...
on 12.12.2007 20:57
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...
on 12.12.2007 21:18
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
on 12.12.2007 22:05
Hi Tony, Am 12.12.2007 um 03:53 schrieb Tony Arcieri: > 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 Arcieri > ClickCaster, Inc. > tony@clickcaster.com _______________________________________________ > Engine-Developers mailing list > Engine-Developers@lists.rails-engines.org > http://lists.rails-engines.org/listinfo.cgi/engine-developers-rails-engines.org -- sven fuchs svenfuchs@artweb-design.de 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)