What if the engine's implementation was as generic as possible and relied on
having an API like approach in which the app could redefine behaviour by
changing just the implementation file. Here's an example:
### Engine
class UserController < Engine::ApplicationController
def create
...
@user.confirm_subscription
...
end
end
class User < ActiveRecord::Base
include Engine::UserSubscriptions
end
module Engine
module UserSubscriptions
def confirm_susbscription
blah
end
end
end
### App
Rewrite the User Subscriptions module not the class itself.
Maybe the example is not the best, but what do you think of this approach of
having all the behaviour you want to expose in mixins and seeing changing the
models or controllers as a bad smell. Does it make sense?
On Oct 1, 2012, at 8:54 AM, Antonio Tapiador del Dujo wrote:
> I found the time to package the decorator pattern into a gem:
>
> http://rubygems.org/gems/rails_engine_decorators
> https://github.com/atd/rails_engine_decorators
>
> Hope it is helpful.
>
>
> El 22/07/12 23:31, Weston Platter escribió:
>>
>> Added 2 strategies for extending Engine Models. Feedback is welcome.
>> https://github.com/lifo/docrails/commit/890b9dd4439986e306ec4fc0067a00effa606204
>>
>> On Friday, July 20, 2012 4:20:48 AM UTC-4, atd wrote:
>> It seems pretty useful for other engines as well! Any chances to be included
>> in Rails?
>>
>> On 13/07/12 06:00, Ryan Bigg wrote:
>>>
>>> We're currently discussing the best way to do this on Forem's issue #260
>>> (https://github.com/radar/forem/pull/260). Kunal there wants to add methods
>>> to or modify the Forem::Post class, and so we're going to go with the
>>> app/decorators directory for that.
>>>
>>> On Friday, 13 July 2012 at 5:49 AM, Mark McSpadden II wrote:
>>>
>>>> There has been some work done on the edgeguides around this as well. There
>>>> are a few notes scattered throughout but I believe this section is that
>>>> you are looking for.
>>>>
>>>> http://edgeguides.rubyonrails.org/engines.html#using-a-class-provided-by-the-application
>>>>
>>>> If that feels incomplete or lacking, please do contribute to make it
>>>> better.
>>>>
>>>> Mark McSpadden
>>>>
>>>> On Thu, Jul 12, 2012 at 3:46 PM, Richard Schneeman
>>>> <[email protected]> wrote:
>>>>> For extending models (and controller methods) I use concerns:
>>>>>
>>>>> https://github.com/schneems/wicked/tree/master/lib/wicked/controller/concerns
>>>>>
>>>>> Then you can include them in other classes or modules in your repo.
>>>>>
>>>>> https://github.com/schneems/wicked/blob/master/lib/wicked/wizard.rb
>>>>>
>>>>>
>>>>> Then you can let your user know to add an `include` statement in the
>>>>> readme.
>>>>>
>>>>> https://github.com/schneems/wicked
>>>>>
>>>>> class AfterSignupController < ApplicationController
>>>>> include Wicked::Wizard
>>>>> Some people like to automatically add methods to ActiveRecord::Base or
>>>>> other similar classes, this allows them to have a dsl like `acts_as_tree`
>>>>> but this just pollutes the available methods, and makes me have to
>>>>> remember unneeded dsl when we ruby already has this type of behavior
>>>>> included with `include`
>>>>>
>>>>>
>>>>> If you want to add methods directly to the ApplicationController of an
>>>>> app you can add a application_controller_helper.rb
>>>>>
>>>>> https://github.com/schneems/opro/tree/master/lib/opro/controllers
>>>>>
>>>>> You need to include it
>>>>>
>>>>>
>>>>> require
>>>>> 'opro/controllers/application_controller_helper'
>>>>>
>>>>> then you can define a helper method for it:
>>>>>
>>>>> def self.include_helpers(scope)
>>>>> ActiveSupport.on_load(:action_controller) do
>>>>> include scope::ApplicationControllerHelper if
>>>>> defined?(scope::ApplicationControllerHelper)
>>>>> end
>>>>> end
>>>>>
>>>>>
>>>>> and finally in your engine:
>>>>>
>>>>>
>>>>> initializer "opro.include_helpers" do
>>>>> Opro.include_helpers(Opro::Controllers)
>>>>> end
>>>>>
>>>>>
>>>>>
>>>>> For extending controllers like devise i've done this:
>>>>>
>>>>> https://github.com/schneems/opro/blob/master/lib/opro/rails/routes.rb
>>>>>
>>>>> You use the user supplied controller or fall back to a default view.
>>>>>
>>>>>
>>>>> Digging in the devise source as well can be tremendously valuable, though
>>>>> slightly daunting the first time or two. Let me know if you have some
>>>>> questions.
>>>>>
>>>>>
>>>>> --
>>>>> Richard Schneeman
>>>>> http://heroku.com
>>>>> @schneems
>>>>> On Thursday, July 12, 2012 at 2:12 PM, Weston Platter wrote:
>>>>>
>>>>>> Is there a "Rails Way" way for extending models and controllers of rails
>>>>>> engines?
>>>>>>
>>>>>> The docs have TODO notes with no content for extending controllers and
>>>>>> models (see 5.2 and 5.3 http://guides.rubyonrails.org/engines.html).
>>>>>>
>>>>>> If there's preferred method, I would love to use it and I'll update the
>>>>>> docs.
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Ruby on Rails: Core" group.
>>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msg/rubyonrails-core/-/q7XpeRAheHkJ.
>>>>>> 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.
>>>>>
>>>>> --
>>>>> 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.
>>>>
>>>> --
>>>> 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.
>>>
>>> --
>>> 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.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Ruby on Rails: Core" group.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msg/rubyonrails-core/-/JUgMoRWK35sJ.
>> 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.
>
>
> --
> 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.
Cumprimentos,
Luís Ferreira
--
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.