4

我正在使用twitter bootstrap创建一个应用程序。我正在使用Font Awesome将图标添加到各个地方,通常是链接。到目前为止,我一直在使用全局助手。这是简化版:

# app/helpers/link_to_with_icon.rb
def link_to_with_icon(text, path, options={})
  options = options.clone
  icon = options.delete(:icon)
  text = "<i class='#{icon}'></i> #{text}" if icon.present?
  link_to(text, path, options)
end

这行得通,但我必须记住每次需要向新链接添加图标时都更改link_to为(该应用程序是新的,所以它在不断变化)。link_to_with_icon所以我决定link_to完全停止使用,取而代之的是link_to_with_icon(因为它是兼容的)。

但是后来我意识到,既然我不再使用link_to了,我还不如一开始就修改link_to。当然,我可以在 lib 文件夹上添加一些猴子补丁以使其理解该:icon选项。

# lib/extensions/url_helper_extensions.rb
module ActionView
  module Helpers
    module UrlHelper

      # do some magic here

    end
  end
end

几年前,我曾经做过类似的事情。在那个时候,alias_method_chain助手是完成这项工作的正确工具。在 rails 3.x 中,似乎不赞成使用模块和继承

但是,如果我正确理解了该页面中的示例,我将需要link_to某种Base模块提供该方法 - 否则您无法向其添加“预扩展”。

因此我的问题是:我可以使用模块扩展 link_to 吗?还是我必须使用alias_method_chain

特别是,该:icon选项的工作实施将不胜感激。

4

2 回答 2

3

我要么将其添加到单独的帮助程序中,要么将其添加到ApplicationHelper

def link_to(text, path, options = {}, &block)
  icon = options.delete(:icon)
  text = content_tag(:i, text, :class => icon) if icon
  super
end

而且您不想克隆选项哈希,因为您不希望将icon选项发送到原始link_to方法。

于 2012-11-26T13:46:10.130 回答
3

我只是这样做:

# app/helpers/my_helper.rb

module MyHelper
  def link_to(text, path, options={})
    options = options.clone
    icon = options.delete(:icon)
    text = "<i class='#{icon}'></i> #{text}" if icon.present?
    super(text, path, options)
  end
end

但是请注意是否曾经使用link_towith 块。

于 2012-11-26T13:27:00.820 回答