【发布时间】:2012-11-13 23:05:22
【问题描述】:
我正在使用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 helper 是完成这项工作的正确工具。在 rails 3.x 中,它似乎是 deprecated in favor of modules and inheritance。
但是,如果我正确理解了该页面中的示例,我将需要某种 Base 模块提供的 link_to 方法 - 否则您无法向其添加“预扩展” .
因此我的问题是:我可以使用模块扩展 link_to 吗?还是我必须使用alias_method_chain?
特别感谢:icon 选项的有效实现。
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming