Forum: Rails Engines development Problems with engine loading and routes w\ Rails 2.0

58a68672882676f6bdf817b3c8ff3880?d=identicon&s=25 Tony Arcieri (Guest)
on 2007-12-12 18:20
(Received via mailing list)
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?
05d703f649ef1d07e78d7b479fb4c4ac?d=identicon&s=25 James Adam (Guest)
on 2007-12-12 20:34
(Received via mailing list)
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,
58a68672882676f6bdf817b3c8ff3880?d=identicon&s=25 Tony Arcieri (Guest)
on 2007-12-12 20:45
(Received via mailing list)
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...
58a68672882676f6bdf817b3c8ff3880?d=identicon&s=25 Tony Arcieri (Guest)
on 2007-12-12 20:57
(Received via mailing list)
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...
58a68672882676f6bdf817b3c8ff3880?d=identicon&s=25 Tony Arcieri (Guest)
on 2007-12-12 21:18
(Received via mailing list)
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
402602a60e500e85f2f5dc1ff3648ecb?d=identicon&s=25 Sven Fuchs (Guest)
on 2007-12-12 22:05
(Received via mailing list)
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...

--
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)
This topic is locked and can not be replied to.