![](/img/trans.png)
[英]Rails - alias_method_chain with a 'attribute=' method
[英]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.