gpt4 book ai didi

ruby-on-rails - 要扩展 Rails 的 `link_to` ,我应该使用 `alias_method_chain` 还是混合 + 继承?

转载 作者:数据小太阳 更新时间:2023-10-29 07:29:01 26 4
gpt4 key购买 nike

我正在使用 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 文件夹上添加一些 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 中它似乎是 deprecated in favor of modules and inheritance .

但是如果我正确理解该页面中的示例,我将需要某种 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 一起使用时要小心。

关于ruby-on-rails - 要扩展 Rails 的 `link_to` ,我应该使用 `alias_method_chain` 还是混合 + 继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13565395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com