Hi Luís,

The possible cases the engine's implementation should cover are huge and indeterminable. Besides, sometimes you should wait for the engine's developers to accept or implement required changes.

The decorator pattern provides a handy, direct and neat mechanism to achieve the stuff.


El 01/10/12 12:08, Luís Ferreira escribió:
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
    <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
    
<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]
    <mailto:[email protected]>> wrote:
    For extending models (and controller methods) I use concerns:

    
https://github.com/schneems/wicked/tree/master/lib/wicked/controller/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
    <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
    <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
    <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
    <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 <http://heroku.com/>
    @schneems <http://twitter.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
    <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
    <https://groups.google.com/d/msg/rubyonrails-core/-/q7XpeRAheHkJ>.
    To post to this group, send email to
    [email protected]
    <mailto:[email protected]>.
    To unsubscribe from this group, send email to
    [email protected]
    <mailto:[email protected]>.
    For more options, visit this group at
    http://groups.google.com/group/rubyonrails-core?hl=en
    <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]
    <mailto:[email protected]>.
    To unsubscribe from this group, send email to
    [email protected]
    <mailto:rubyonrails-core%[email protected]>.
    For more options, visit this group at
    http://groups.google.com/group/rubyonrails-core?hl=en
    <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]
    <mailto:[email protected]>.
    To unsubscribe from this group, send email to
    [email protected]
    <mailto:[email protected]>.
    For more options, visit this group at
    http://groups.google.com/group/rubyonrails-core?hl=en
    <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]
    <mailto:[email protected]>.
    To unsubscribe from this group, send email to
    [email protected]
    <mailto:[email protected]>.
    For more options, visit this group at
    http://groups.google.com/group/rubyonrails-core?hl=en
    <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] <mailto:[email protected]>. To unsubscribe from this group, send email to [email protected] <mailto:[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.

--
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.

Reply via email to