So i've been banging my head against this for the better part of the
last 5 hours and I have concluded that in my sleep deprived state I'm
missing something really obvious and should just ask for help.
I need to be able to access named route helpers (XXX_path and XXX_URL)
form a class method in an ActiveRecord model. I tried a couple of
approaches none of which worked:
1) include ActionController::UrlWriter in the model class -- this
doesn't work because the included methods are instance methods and
thus are not available in the class methods
2) According to the rails api you can access the helpers by using
ActionController::UrlWriter.xxx_path (http://api.rubyonrails.org/
classes/ActionController/UrlWriter.html). However that just doesn't
work for me, I get the following error
NoMethodError: undefined method `xxx_path' for
ActionController::UrlWriter:Module
The helpers are defined in an anonymous module hidden inside the
routing stuff. You can ask rails to include that module in a class for
you, eg
class Foo
include ActionController::UrlWriter
def generate
parent_categories_url :host => 'example.com'
end
end
ActionController::Routing::Routes.named_routes.install(Foo)
This only works for instance methods, my problem is that I need to be
able to access xxxx_path from a class method... meaning:
class Foo
include ActionController::UrlWriter
def self.generate
login_path :host => 'example.com'
end
end
ActionController::Routing::Routes.named_routes.install(Foo)
Foo.generate
#=> NameError: undefined local variable or method `login_path' for
Foo:Class
from (irb):4:in `generate'
from (irb):9
This only works for instance methods, my problem is that I need to be
able to access xxxx_path from a class method... meaning:
Well there's nothing stopping you bundling up your url generation
stuff into its own class and then do UrlGenerator.new.generate (I'd
even reccomend it seing as install the routes will pollute your
model's name space with loads of methods.
A small experiment shows that
ActionController::Routing::Routes.named_routes.install isn't actually
needed - UrlWriter's included method seems to call that for you
Yea i guess it just seems silly to create a separate class who's only
purpose is to include ActionController::UrlWriter, especially since
the rails documentation says that you can simply call
ActionController::UrlWriter.xxx_path.
As in many cases, if it's difficult to do in Rails, it's probably
wrong. Can you give more detail on why you're generating URLs in a
model rather than in the controller/view that's sending them to the
user?
I am generating a URL for use with GoogleCheckout. I have a method in
a model that uses the visitors shopping cart to construct an xml
request to GoogleCheckout, in that request i need to include a
callback url that GoogleCheckout can use to contact my webapp.
I am generating a URL for use with GoogleCheckout. I have a method in
a model that uses the visitors shopping cart to construct an xml
request to GoogleCheckout, in that request i need to include a
callback url that GoogleCheckout can use to contact my webapp.
I am in the same situation, needing to access the named routes from
within a class method and am having no luck coming up with a logic
solution. It seems that every post out there asking the same thing gets
met with "if it's so difficult, you probably shouldn't be doing it." I
usually agree with this, but generating a callback for any 3rd party api
calls that get made at a class level seems like a pretty acceptable
requirement.
Did you ever come to a solution that worked for you admin@fotocera?