簡體   English   中英

為了擴展rails的link_to,我應該使用alias_method_chain還是mixins +繼承?

[英]To extend rails' `link_to`, should I use `alias_method_chain` or mixins + inheritance?

我正在使用twitter bootstrap創建一個應用程序 我正在使用“ 真棒字體”將圖標添加到各個地方,通常是鏈接。 到目前為止,我一直在使用全局助手。 這是簡化版:

# 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文件夾上添加一些monkeypatching,以使其了解: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中,似乎不贊成使用模塊和繼承

但是,如果我正確地理解了該頁面中的示例,則需要某種Base模塊提供link_to方法-否則您無法在其中添加“預擴展”。

因此,我的問題是: 我可以使用模塊擴展link_to嗎? 或者我必須使用alias_method_chain嗎?

特別是, :icon選項的有效實現將不勝感激。

我只是做:

# 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與block一起使用。

我要么將其添加到單獨的幫助器中,要么將其添加到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方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM