Forum: Ruby on Rails Why does 'extend ActiveSupport::Concern' cause `undefined method 'recycle!'`?

Posted by Weston Platter (think602)
on 2012-12-02 00:20
(Received via mailing list)
Working on Rails Engine.

I want to make the controllers customizable whereever the Rails Engine 
is
used.

Therefore, I was trying to use `extend ActiveSupport::Concern` on the
Engine controller class and include it in MyRailsApp.

https://gist.github.com/4185823

# code in my rails engine

moduel MyEngine
  class SomeController
    extend ActiveSupport::Concern

    def engine_some_method
    end
  end
end


# code in my rails app where engine is implemented

class SomeController
  include MyEngine::SomeController

  def app_some_method
  end

  # code that's available by including the Rails Engine code
  # def engine_some_method
  # end
end

But, this breaks my rpsec controller tests because of an undefined
"recycle" method.

12) Qe::Admin::QuestionPagesController POST reorder
     Failure/Error: xhr :post, :create,
     NoMethodError:
       undefined method `recycle!' for
#<Qe::Admin::QuestionPagesController:0x007f80aa1c7528>
     # ./spec/controllers/admin/pages_controller_spec.rb:69:in `block (2
levels) in <top (required)>'

When I comment out the "include MyEngine::Controller" everything passes.

Why?
Posted by Frederick Cheung (Guest)
on 2012-12-02 02:12
(Received via mailing list)
On Dec 1, 7:19pm, Weston Platter <westonplat...@gmail.com> wrote:

> levels) in <top (required)>'
>
> When I comment out the "include MyEngine::Controller" everything passes.
>

If it's commenting out the include that fixes things, why are you so
sure that it's the extend at fault rather than something else in the
module? Personally I'd be inclined to thing that by including your
module you're accidentally shadowing an existing method on the
controller - if you were to show a minimal example that reproduces the
problem rather than dummy code someone might be able to have a guess
(I suspect the issue may have been lost in translation from your
actual code to the example you gave since the latter isn't valid ruby
(for example you're including a class rather than a module)

Fred
Posted by Weston Platter (think602)
on 2012-12-03 00:24
(Received via mailing list)
What you said makes sense.

I incorrectly said I commented out
include MyEngine::SomeController

when I meant to say commenting out
extend ActiveSupport::Concern

fixes the issue.


The codeabse is here,
https://github.com/twinge/questionnaire_engine/tre...
.

The specific Controller Class is here,
https://github.com/twinge/questionnaire_engine/blo...

The specific Controller Spec test is here,
https://github.com/twinge/questionnaire_engine/blo...
Posted by Frederick Cheung (Guest)
on 2012-12-03 02:01
(Received via mailing list)
On Dec 2, 7:22pm, Weston Platter <westonplat...@gmail.com> wrote:
> What you said makes sense.
>
> I incorrectly said I commented out
> include MyEngine::SomeController
>
> when I meant to say commenting out
> extend ActiveSupport::Concern
>

Calling extend activesupport::concern on a controller sounds like a
weird thing to do
 - it's supposed to be used on modules. What were you trying to do
with it?

Fred
Posted by Frederick Cheung (Guest)
on 2012-12-03 02:07
(Received via mailing list)
On Dec 2, 9:00pm, Frederick Cheung <frederick.che...@gmail.com>
wrote:
> Calling extend activesupport::concern on a controller sounds like a
> weird thing to do
> - it's supposed to be used on modules. What were you trying to do
> with it?

And I assume that the reason this causes a problem is something to do
with how as::concern changes the behaviour of include so as to setup
module dependencies.

Fred
Posted by Weston Platter (think602)
on 2012-12-08 19:53
(Received via mailing list)
I think I need to wrap class methods in a "module ClassMethods" block.

require 'active_support/concern'
module M
  extend ActiveSupport::Concern

  included do
    scope :disabled, where(:disabled => true)
  end

  module ClassMethods
    ...
  endend
Posted by Frederick Cheung (Guest)
on 2012-12-09 17:26
(Received via mailing list)
On Saturday, December 8, 2012 6:51:50 PM UTC, Weston Platter wrote:
>
> I think I need to wrap class methods in a "module ClassMethods" block.
>
> Yes, that's the way to add class methods with AS::Concern.

Fred
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.