Rails(3.2.7):覆盖asset_host的image_tag

Mic*_*rey 6 overriding ruby-on-rails-3 asset-pipeline rails-api

development.rb:

config.action_controller.asset_host = "assets.myserver.com"
Run Code Online (Sandbox Code Playgroud)

查看脚本:

<%= image_tag('header.jpg') %>
Run Code Online (Sandbox Code Playgroud)

收益率:

<img alt="Header" src="/header.jpg" />
Run Code Online (Sandbox Code Playgroud)

应该:

<img alt="Header" src="http://assets.myserver.com/header.jpg" />
Run Code Online (Sandbox Code Playgroud)

我正在使用rails-api我猜的宝石禁用一些资产和查看渲染的东西.

似乎不应该太难以重新实现(覆盖image_tag)来添加这个非常小的功能.想要这样做似乎有点奇怪.但是,我是新手,想知道如何做到这一点作为学习经验.

问题:

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

hjb*_*lok 3

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

<img alt="Header" src="http://assets.myserver.com/assets/header.jpg" />
Run Code Online (Sandbox Code Playgroud)

我已经在 Rails 3.2.7 和 3.2.8 下测试了它,但它在两个版本中都有效。

更新

在我原来的答案中,我没有使用rails-api宝石。使用rails-api宝石时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
Run Code Online (Sandbox Code Playgroud)

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

文件的名称并不重要。config/initializers当应用程序启动时,将加载其中的所有文件。

基本上,这是 Ruby 的一项语言功能,Ruby 允许您在代码中的任何位置重新打开类并添加或替换方法(您可以在ruby​​learning.com上找到有关此主题的更多信息)。