Calling Controller methods from application controllers

Is there a way/workaround to call a controller method from application
controller?

If you're asking that question, chances are you're doing something wrong

That said if you have

ApplicationController < ActionController::Base
   def another_method
     some_method
   end
end

then you it will work as long as your controller has a method called
some_method

Fred

Frederick Cheung wrote:

Is there a way/workaround to call a controller method from application
controller?

If you're asking that question, chances are you're doing something wrong

That said if you have

ApplicationController < ActionController::Base
   def another_method
     some_method
   end
end

then you it will work as long as your controller has a method called
some_method

Fred

Thanks for the quick reply Fred. But my issue is that some_method is in
SomeController, not in application controller. And i need to call
specific functions in specific controllers. like SomeOneController.new,
SomeTwoController.new, SomeOneController.some_method,...

Frederick Cheung wrote:

Is there a way/workaround to call a controller method from
application
controller?

If you're asking that question, chances are you're doing something
wrong

That said if you have

ApplicationController < ActionController::Base
  def another_method
    some_method
  end
end

then you it will work as long as your controller has a method called
some_method

Fred

Thanks for the quick reply Fred. But my issue is that some_method is
in
SomeController, not in application controller. And i need to call
specific functions in specific controllers. like
SomeOneController.new,
SomeTwoController.new, SomeOneController.some_method,...

Then you're handling this the wrong way. The common code should be in
a module included in all the relevant controllers or pushed down into
the model.

Fred

Frederick Cheung wrote:

That said if you have
Fred

Thanks for the quick reply Fred. But my issue is that some_method is
in
SomeController, not in application controller. And i need to call
specific functions in specific controllers. like
SomeOneController.new,
SomeTwoController.new, SomeOneController.some_method,...

Then you're handling this the wrong way. The common code should be in
a module included in all the relevant controllers or pushed down into
the model.

Fred

Common code is the code used for calling the some_method, its in the
ApplicationController. What i need is to call specific methods in
specific controllers.

This is the scenario to explain.

1. User logs in (there are ajax based dashboard widgets that can be
updated by user)

2. If user clicks on a widget after the session timed out, the ajax
based login window will pop up (similar to light box) for user
verification. There is a before_filter for checking timeout and it
render the login window.

3. After verifying the user, login window will be closed

4. Ajax dashboard widget will be updated

However this 4th step is not happening if ajax login window is shown and
user is verified.

My idea is to capture and save the original request, because the filter
chain get halted at the point of before_filter render the login window
(4th step is not happening as the login window closes). My plan is to
save the request info and then call the specific method in specific
controller based on that saved original request info. There would be
many widgets that use the ajax login window.. so I need to keep this
DRY..

Any suggestion/help welcome..!

Hi --

Frederick Cheung wrote:

Is there a way/workaround to call a controller method from application
controller?

If you're asking that question, chances are you're doing something wrong

That said if you have

ApplicationController < ActionController::Base
   def another_method
     some_method
   end
end

then you it will work as long as your controller has a method called
some_method

Fred

Thanks for the quick reply Fred. But my issue is that some_method is in
SomeController, not in application controller. And i need to call
specific functions in specific controllers. like SomeOneController.new,
SomeTwoController.new, SomeOneController.some_method,...

See Fred's answer, to which I'll add: I think there's some confusion
about how method-calling works. If you really mean SOC.some_method,
then you're talking about a class method:

   class SomeOneController
     def self.some_method
       # etc.

rather than an instance method. If you define an instance method
called some_method in SomeOneController, then it's not a matter of
calling it from other controllers; it's a matter of whether or not you
have an object in scope that can execute that method. (Actually that's
always the question. With class methods, the necessary object happens
to be a class object.)

David

David A. Black wrote:

Hi --
See Fred's answer, to which I'll add: I think there's some confusion
about how method-calling works. If you really mean SOC.some_method,
then you're talking about a class method:

   class SomeOneController
     def self.some_method
       # etc.

rather than an instance method. If you define an instance method
called some_method in SomeOneController, then it's not a matter of
calling it from other controllers; it's a matter of whether or not you
have an object in scope that can execute that method. (Actually that's
always the question. With class methods, the necessary object happens
to be a class object.)

David

--

David, I'm a noob to ruby, sorry if i'm not asking the correct question.
The method is not a class method. The method would be a normal method we
find in any controller new, index, create.. etc. is it possible for me
to access that method from ApplicationController.

I just posted SomeController.some_method they way i saw it. I just need
to find a workaround similar to that. My 3rd post explains what i need
to use this functionality for..

Brian Dainton wrote:

2 things for you.

1.) The guys above give good advice. However, to solve your exact
problem, just add a blank definition of some_method in
ApplicationController, like so:

ApplicationController < ActionController::Base

   def some_method
   end

   # you already had this another_method in here, so I'm leaving it in
   def another_method
     some_method
   end
end

When you call some_method from another_method, it will find your
inherited some_method implementation in SomeController and use it.

2.) When communicating class methods versus instance methods, in Ruby,
you want to indicate a class method like so:

    ClassName.some_class_method

and an instance method like this:

    ClassName#some_instance_method

Just FYI.

Best,
- BD
http://www.buddingrubyist.com
http://www.fiveruns.com

On Apr 24, 5:50�am, Buddhi De silva <rails-mailing-l...@andreas-s.net>

Thanka Brian, highly appreciate your advice... I think latter one could
do what i need to do.. Fred and David thanks heaps for your advice as
well..

Hope this will work.. i'll keep posted on progress
- buddhi

Brian Dainton wrote:

2.) When communicating class methods versus instance methods, in Ruby,
you want to indicate a class method like so:

    ClassName.some_class_method

and an instance method like this:

    ClassName#some_instance_method

Just FYI.

Best,
- BD
http://www.buddingrubyist.com
http://www.fiveruns.com

On Apr 24, 5:50�am, Buddhi De silva <rails-mailing-l...@andreas-s.net>

Hi Brian,

the "#" in ClassName#some_instance_method is treated as a comment

Any ideas?

You can't actually write:

ClassName#some_instance_method

in your code. If you want to use an instance method, you need to call it
on an instance of the class, not the class itself. Consider a simple
example.

class SomeClass
  def self.some_class_method

  end

  def some_instance_method

  end
end

If I want to call the class method then I would type:

SomeClass.some_class_method

but to use an *instance* method, you need to call the method on an
instance of the class.

For example you might do

s = SomeClass.new
s.some_instance_method

I realize this doesn't translate very well to controllers although I
have to be honest the requirement tells me that you are going about it
the wrong way. You should *never* have to invoke methods from multiple
other controllers actions from within the application controller at
once.

I think the easier way is going to be a simple redirection after step
3 is completed. Save the params hash on the session and redirect the
user to the Controller#action he requested when the session was timed
out. Then you could setup another before_filter that looks for a
params hash on the session, and if found, loads that data onto the
current params hash. This will incur a regular request instead of
Ajax, but I think it is the best way to do it.

Buddhi,

The '#' is for when you are trying *communicate* an instance method.
Not when coding it. You'll see it all the time in Ruby documentation.

Again, to answer your original question, if you still have your code
in the same state as when you created this post, just add a blank
some_method instance method to your ApplicationController.

    def some_method
    end

That's it.

- BD
http://www.buddingrubyist.com
http://www.fiveruns.com

I'm still stuck with the same issue and it seems I've to accept what
rails/ruby has set as rules/limitations.. hoping those are there for our
own good.. :slight_smile:

Q1. However I have another question if all can kindly share the way they
would solve the issue..

Scenario:

1. User logs in (there are ajax based dashboard widgets that can be
updated by user)

2. If user clicks on a widget after the session timed out, the ajax
based login window will pop up (similar to light box) for user
verification. There is a before_filter for checking timeout and it
render the login window.

3. After verifying the user, login window will be closed

4. Ajax dashboard widget will be updated

However this 4th step is not happening if ajax login window is shown and
user is verified.. because the filter chain get halted at the point of
before_filter render the login window (4th step is not happening as the
login window closes)