Is there a way to call helper methods in a controller?


#1

Hi,

Is there a way to call helper methods in a controller?
I want to do something like this in my controller

Class MyController < Action…

def my_method
string = link_to “some_url”, :controller => “home”, :action =>
“command”
end

end

link_to is an ActionView helper method and it seems that I couldn’t
access
the method in the controller even if I used the complete namespace…
ActionView::Helpers::UrlHelpers::link_to

I’ve also done some testing in irb and it says the method is undefined…

ActionView::Helpers::UrlHelper
=> ActionView::Helpers::UrlHelper

ActionView::Helpers::UrlHelper::link_to
NoMethodError: undefined method `link_to’ for
ActionView::Helpers::UrlHelper:Module
from (irb):59

Any clues?

Thanks,
Mac


#2

Hi Mac,

big mac <bigmac928@…> writes:

Hi,
Is there a way to call helper methods in a controller?
I want to do something like this in my controller
Class MyController < Action…
def my_method
string = link_to “some_url”, :controller => “home”, :action => “command”
end
end
link_to is an ActionView helper method and it seems that I couldn’t

Using render :inline you can use the normal <% %> tags which can contain
helper
methods.

Try something along the lines of

render :inline => “<%= link_to ‘some_url’, :controller => ‘home’,
:action =>
‘command’ %>”

Of course you might want to render more than the link, but that’s what
views are
for.

Bob
PS sorry if this is not what you were hoping for.


#3

Hi Mac,

Helpers are Ruby Modules so you can include them in controllers (or any
object) like so (though I’m not sure if someone’s going to smack me for
suggesting this):

class SomeController < ApplicationController

include ActionView::Helpers::NumberHelper

def index
# you can use number_to_currency here, for example.
end

end

I use this to format error messages my models generate. I.e. I want to
say “You can’t afford this, you only have $30.00 and the item costs
$32.00” rather than 30. and 32.0.

I imagine it could get a bit out of hand (hence my smack comment above).
Rails is supposed to guide you to develop well encapsulated
applications, so use this wisely.

Ryan.


#4

Helpers are Ruby Modules so you can include them in controllers (or any
object) like so (though I’m not sure if someone’s going to smack me for
suggesting this):

(no smacking, just thinking :wink:

i didn’t try, but isn’t there the caveat of having all the module public
methods exposed as valid controller actions in that case ? (I’m not sure
weither the module methods will be exposed as action, but it deserves a
test!)

hth


#5

Oh, that’s a very interesting point… The hepler methods are infact
exposed when you simply include it!

We could do this, though:

include ApplicationHelper

for m in ApplicationHelper.instance_methods
hide_action m
end

Thus using ActionController’s hide_action to hide all the included
methods… Or some meta-thingy:

class ActionController::Base
def self.include_helper_in_controller(mod)
include mod
for m in mod.instance_methods
hide_action m
end
end
end

And then just go:

class MyController < ApplicationController
include_helper_in_controller ApplicationHelper
end

I typically only include helpers in my models (and rarely at that) to
help format error messages :slight_smile:

(no smacking, just thinking :wink:

I suppose thinking is better than smacking in this case! (though I’d
argue that depends on the company).

-RYan.