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?