6

开发.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我猜想禁用某些资产和查看渲染内容的 gem。

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

问题:

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

1 回答 1

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-apigem时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保持不变。查看github上的 Rails存储库以获取该方法的完整“示例” image_tag

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

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

于 2012-08-31T15:32:02.433 回答