I have found it useful to populate my local development database with data from our production server in order to be able to get good test coverage. However, a perpetual problem I’ve had with this approach is that it introduces an environment where sometimes images are available and sometimes they aren’t (the database knows about all the images, but some were uploaded locally, some reside on our main servers, and some are on S3).
What I’ve found is that even though Rails doesn’t give exceptions when it finds missing images, it does start to get painfully slow. Each missing image it has to process usually takes about 2 seconds. On pages with 5-10 missing images, the wait could be quite painful.
So I finally got fed up yesterday and wrote a hacky patch to get around this problem. Here it is:
def self.force_image_exists(image_location) default_image = "/images/dumpster.gif" if(image_location && (image_location.index("http") || File.exists?(RAILS_ROOT + "/public" + image_location.gsub(/\?.*/, '')))) image_location else default_image end end
This function is part of a utility class (named “UtilityGeneral”) that we use for various miscellaneous tasks. I call this method from a simple mixin:
if RAILS_ENV == 'development' module ActionView module Helpers #:nodoc: module AssetTagHelper # replace image tag def path_to_image(source) original_tag = ImageTag.new(self, @controller, source).public_path UtilityGeneral.force_image_exists(original_tag) end end end end end
If anyone else works locally with images that may or may not exist, this wee patch should come in handy to save you from load times of doom on pages that are missing images. It just subs in an alternate image when the real image doesn’t exist locally.
P.S. When I grow up, I want a blog about coding that lets me paste code.
P.S.S. 4/10: I grew up!