Rails(3.2.7):覆盖asset_host的image_tag

时间:2012-07-28 00:41:57

标签: ruby-on-rails-3 override asset-pipeline rails-api

development.rb:

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

查看脚本:

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

产率:

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

应该是:

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

我正在使用我猜的rails-api宝石禁用某些资产并查看渲染内容。

似乎不应该太难以重新实现(覆盖image_tag)来添加这个非常小的功能。想要这样做似乎有点奇怪。但是,我对rails很感兴趣,想知道如何将其作为一种学习体验。

问题:

  1. 作为最佳实践,我应该将这个新代码放在文件结构中吗?
  2. 我应该用新代码命名文件?
  3. rails如何知道查看新代码而不是查看旧的image_tag函数?

1 个答案:

答案 0 :(得分:3)

我已尝试过您的配置,但是当我在config.action_controller.asset_host = "assets.myserver.com" development.rb中使用image_tag按预期方式工作时:

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

我在Rails 3.2.7和3.2.8下测试了它,但它适用于两个版本。

<强>更新

在我原来的回答中,我没有使用rails-api宝石。使用rails-api gem image_tag时,如问题中所述。

回答实际问题,您可以在config/initializers中添加初始值设定项。只需使用以下代码创建一个文件,例如image_tag_helper.rb

# 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

这基本上是重新打开模块并用您自己的方法替换image_tag方法。 module AssetTagHelper中的所有其他方法保持不变。请查看Rails repository at github以获取image_tag方法的完整“示例”。

文件的名称并不重要。引导应用程序时会加载config/initializers中的所有文件。

基本上这是Ruby的语言特性,Ruby允许您在代码中的任何地方重新打开类并添加或替换方法(您可以在rubylearning.com找到关于此主题的更多内容)。