This really sounds like you're better off with Cells (Portlets for Rails) http://cells.rubyforge.org/ - we try hard to encourage encapsulation and putting view components into separate engines.
Nick On 20 Jun., 18:26, Rodrigo Rosenfeld Rosas <[email protected]> wrote: > From an API perspective, maybe what you want is something event-based, > like Redmine or Chiliproject's plugins system. > > Take a look at Apotomo (http://apotomo.de/) for an example of what I'm > talking about. Maybe that approach makes more sense than trying to > emulate some OO inheritance overriding methods in Modules through class > reopening and wanting to use "super" that way. Ruby doesn't support > that and I would recommend you to try another approach if your desired > results are something like Redmine's plugin system. > > Cheers, Rodrigo. > > Em 17-06-2011 18:00, Jonathan Rochkind escreveu: > > > This one is driving me crazy, appreciate it VERY much if someone can > > even give me some hints at where to look in Rails source code to > > understand/debug what's going on, I'm getting lost trying to look > > through it. > > > Rails 3.0.8. I have an engine(gem). > > > It provides a controller at app/controllers/advanced_controller.rb, > > and a corresonding helper at app/helpers/advanced_helper.rb. (And some > > views of course). > > > So far so good, the controller/helper/views are just automatically > > available in the application using the gem, great. > > > But I want to let the local application selective over-ride helper > > methods from AdvancedHelper in the engine (and ideally be able to call > > 'super'). That's a pretty reasonable thing to want to allow, right, a > > perfectly reasonable (and I'd think common) design? > > > Problem is I can't get it to work. Let's say there's a method > > #do_something in the engine's app/helpers/advanced_helper.rb. > > > * If the local app provides an app/helpers/advanced_helper.rb, > > then it completely replaces the one from the engine, the one from the > > engine isn't loaded at all. (So it has none of it's methods, even > > though we just wanted to over-ride one of em). Okay, this isn't > > actually TOO unexpected. > > > * So I provide a helper called, say > > local_advanced_helper.rb(LocalAdvancedHelper) in my local app/helpers. > > It DOES load. If it implements a #new_method_name, that helper is of > > course available in views (including the engine's views, as it > > happens). However, if it tries to over-ride the engine's > > #do_something ... the local do_something is never called. > > > The engine's helper seems to be 'included' in the module providing > > helper methods to views earlier in the call chain (later in the > > 'include' order) then my local helpers. So there's no way for local > > helpers to over-ride helpers from the engine. (The engine could > > theoretically call 'super' to call 'up' to the local view helper with > > the same name, but of course that makes little sense, that kind of > > dependency is probably seldom appropriate). The ones from the engine > > are always first in the call chain, before any view helper modules in > > local app. > > > Can anyone shed any light on what's going on? Including pointing me to > > the relevant parts of Rails code? Or suggesting any way I can get > > this kind of design (local app can over-ride view helpers provided by > > Engine) to work? Or tell me if this is a bug, or by design, or > > neither (just didn't consider use case), or what? > > > Any feedback much appreciated. I've been going crazy trying to figure > > this out for hours now. Also posted (in slightly different words) at > >http://stackoverflow.com/questions/6380064/rails3-engine-helper-over-... > > > Jonathan -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
