Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails (3.2.7): override image_tag for asset_host

development.rb:

config.action_controller.asset_host = "assets.myserver.com"

view script:

<%= image_tag('header.jpg') %>

yields:

<img alt="Header" src="/header.jpg" />

should be:

<img alt="Header" src="http://assets.myserver.com/header.jpg" />

I am using the rails-api gem which I am guessing disables some asset and view rendering stuff.

It seems like it should not be too hard to re-implement (override image_tag) to add this very small feature. It may seem a little odd to want to do this. However, I am new-ish to rails would like to know how to do this as a learning experience.

Questions:

  1. As a best practice where should I place this new code in the file structure?
  2. What should I name the file with the new code?
  3. How does rails know to look at the new code instead of looking at the old image_tag function?
like image 367
Michael Avatar asked Jul 28 '12 00:07

Michael


1 Answers

I've tried your configuration, but when I use config.action_controller.asset_host = "assets.myserver.com" in my development.rb image_tag works as expected:

<img alt="Header" src="http://assets.myserver.com/assets/header.jpg" />

I've tested it both under Rails 3.2.7 and 3.2.8, but it works in both versions.

UPDATE

In my original answer I didn't use the rails-api gem. When using the rails-api gem image_tag works as described in the question.

Well to answer the actual question, you could add an initializer in config/initializers. Just create a file, lets say image_tag_helper.rb, with the following code:

# config/initializers/image_tag_helper.rb
module ActionView
  module Helpers
    module AssetTagHelper
      def image_tag(source, options = {})
        options[:src] = "http://#{source}"
        tag("img", options)
      end
    end
  end
end

What this basically does is reopening the module and replace the image_tag method with your own method. All other methods within the module AssetTagHelper remain the same. Take a look at the Rails repository at github for a complete 'example' of the image_tag method.

The name of the file doesn't really matter. All files within config/initializers are loaded when the application is booted.

Basically this is a language feature of Ruby, Ruby allows you to reopen classes everywhere in your code and add or replace methods (you find more on this subject at rubylearning.com).

like image 83
hjblok Avatar answered Oct 21 '22 19:10

hjblok