Understanding where certain 'inherited' methods come from in ActionController::Base

Hi I just started getting my hands on Rails, I've been reading a good
book on the subject but now I want to continue by myself and with the
help of the rails api documentation but I find it quite difficult to
follow (copared with the Java generated docs for example).

One thing that I still can't get to understand is how methods like
'layout' become available on my controllers to mention one example I
supposed that the method was defined inside ActionController::Base but
reading the docs I see there is no such thing defined there.

Can you please clarify on this issue, I believe it may be something
related to the Ruby that I still don't know about.

Thanks in advance.
M.

Try apidock.com.

http://apidock.com/rails/ActionController

Hope it helps.

Ok thanks for the info, those docs seem more friendly, anyway, I still
don't understand where those methods (for ex. layout) get inherited or
injected don't know how that magic happens they aren't mentioned even
in apidock.com.

Thanks
m.

when in doubt, cd to one of your projects and e.g.
  find vendor/rails -type f -exec grep -H 'def layout' {} \;

You'll see exactly how the magic happens :slight_smile: (and in this case, also
lots o' comments).

HTH,

Thanks again for the feedback, yep I already did a recursive grep
inside my gems dirs and found those definitions I guess there i'll
find the real info, anyway what I find confusing is that in the docs
those automatic inclusions are not mentioned, maybe those are obvious
or implicit and they can be derived from the module name I really
don't know because Im also new to the Ruby language.

Is it possible that because both ActionController::Base and
ActionController::Layout::ClassMethods share th 'ActionController'
module they are inside the same namespace and all public methods of
Layout are available to Base? Can I conclude that this is the case
with all clases inside ActionController?

Please excuse my enormouse ignorance on the subject
Thanks for you patience!
m.

It might be easier to understand what's going on in Rails master. Take
a look at http://github.com/rails/rails/blob/master/actionpack/lib/action_controller/base.rb#L5-37.
As you can see, the Base class is including a series of modules. In
Ruby, modules are like dynamic superclasses; including one adds the
module to the superclass chain.

For instance, observe that ActionController::Base includes
ActionController::UrlFor. You can follow that module to
http://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/url_for.rb,
which has the much-used url_for method (http://github.com/rails/rails/
blob/master/actionpack/lib/action_controller/metal/url_for.rb#L28-39).

Hope this helps.

-- Yehuda

Thanks Yehuda that was of help.
m.