【问题标题】:Rails (3.2.7): override image_tag for asset_hostRails (3.2.7):覆盖asset_host 的image_tag
【发布时间】:2012-07-26 16:34:24
【问题描述】:

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 gem,我猜它会禁用一些资产并查看渲染内容。

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

问题:

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

【问题讨论】:

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


【解决方案1】:

我已经尝试过您的配置,但是当我在 development.rb 中使用 config.action_controller.asset_host = "assets.myserver.com" 时,image_tag 可以正常工作:

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

我在 Rails 3.2.7 和 3.2.8 下都对其进行了测试,但它在两个版本中都可以使用。

更新

在我的原始答案中,我没有使用 rails-api gem。使用 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 找到更多关于此主题的信息)。

【讨论】:

  • 你在使用rails-api gem吗?
  • 不,我没有,我在阅读您的问题时显然错过了那一行。
猜你喜欢
  • 2014-07-02
  • 2016-05-13
  • 2011-08-10
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多