【问题标题】:To extend rails' `link_to`, should I use `alias_method_chain` or mixins + inheritance?要扩展 rails 的 `link_to`,我应该使用 `alias_method_chain` 还是 mixins + 继承?
【发布时间】: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


    【解决方案1】:

    我会这样做:

    # 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_to 与块一起使用。

    【讨论】:

    • 为什么不也发送块呢?另外,你的意思是调用方法link_to
    • @apneadiving 我假设您还想在 ActionView::Helpers::UrlHelper 中包含该模块,对吧?
    • @kikito 不用,试试看
    • 哦,您还在 app/helpers 中使用了帮助程序,而不是 lib 中的文件。明白了。
    • 没错,这种情况我只用helpers,否则我就依赖presenters
    【解决方案2】:

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

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

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

    【讨论】:

    • 只使用助手的好处。谢谢。关于克隆:仔细看看。 :icon 选项未发送到 link_to。但是我不想直接修改options,因为它可能会在多个链接中使用(删除是一种破坏性的方法,它会修改哈希)。
    • 嗯,这很有道理。然后只需与上面相同的代码,但使用您的原始克隆就可以了。
    猜你喜欢
    • 2013-09-26
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多