absolute url to images from the model?

I have a need to pass full, absolute urls to images for an interaction
with Facebook. I dont think I can use the view helpers (e.g.
image_tag) from the model though...

Is there a way to do this from the model (or less desirable, from the
controller)?

or if I cant use image_tag, is there another way to build these urls
from the model?

Your data model layer should not be aware of application state (or even assume it is part of a web app). So, this should be done from the controller/view layer.

Mat Brown wrote:

Your data model layer should not be aware of application state (or even
assume it is part of a web app). So, this should be done from the
controller/view layer.

I have a need to pass full, absolute urls to images for an interaction
with Facebook. I dont think I can use the view helpers (e.g.
image_tag) from the model though...

Is there a way to do this from the model (or less desirable, from the
controller)?

or if I cant use image_tag, is there another way to build these urls
from the model?

--
You received this message because you are subscribed to the Google
Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe@googlegroups.com<rubyonrails-talk%2Bunsubscribe@googlegroups.com>
.
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.

If interaction with Facebook requires an absolute path to an image, and
this Facebook interaction is part of his app's "domain logic," a model
is perfectly appropriate place for this...

To do what you're asking, you'll need to first set

config.action_controller.asset_host = "http://your_assets.domain"

Then, to use image_tag or image_path, include
ActionView::Helpers::AssetTagHelper into your model (or extend some
object with it).

Mat Brown wrote:

Your data model layer should not be aware of application state (or even
assume it is part of a web app). So, this should be done from the
controller/view layer.

More regards to this: I am *deathly afraid* of communicating with web
services during my apps' request/response cycles; you have no idea how
long it will take for the service to respond back to you, and when
something with the service goes wrong (after possibly minutes of
waiting), it tends to go wrong in completely unexpected and magical ways
(often you'll not even *get* a timeout!). Doing this kind if ish in a
background service is trivial if this logic already exists in a model;
its impossible if the logic is in a controller.

When we use the word "model", we can mean different things - a narrow
definition would be an object representing persistent data, e.g. an
ActiveRecord instance. We also use it more broadly to mean "a class
encapsulating business logic".

I'm all for skinny controllers, but I think for non-trivial apps it's
important to make a distinction between the data model (which should
really just be in the business of representing data) and other things
that encapsulate business logic - e.g., the Command pattern. That
pattern is likely appropriate for the Facebook task here - and of
course, if you encapsulate business tasks in a Command object, they
can be trivially called either synchronously in the controller or
asynchronously in a background job. And, for what it's worth,
background jobs are a great example of why the data model shouldn't
assume it's running inside a web app. The use of the asset_host
configuration is a common pattern and it works, but in the end it's
really just a fancy way of setting a global variable.

In summary: agreed entirely that the logic should be in the model, if
by "model" we mean "a class that isn't the controller". And also
agreed entirely that a background job is the right place to do this.
But I maintain that the *data* model shouldn't access, or assume the
existence of, web application state.

Thx for the replies, Mat and Paul.

I agree w Paul in this case. The model is responsible for the
communication w FB as part of a cross-posting step that is part of the
business logic. So, that's where I'm putting this.

And it kinda works... it *does* work as far as being able to call
image_path from the model, but...

Something odd is going on in that I included the line

config.action_controller.asset_host = "http://your_assets.domain"

with an absolute IP addrs (domain is not established yet) in both my
config/development.rb and config/production.rb files but when I run in
dev mode the urls always come out like:

http://localhost:3000//images/newbie.gif

without the IP addrs at the front. I've rebooted rails to make sure
this config is getting picked up.

Any ideas why I keep getting localhost?