我正在使用名为link_to_admin
的方法,然后我将另一个名为simple_link_to
的方法别名
def link_to_admin(name,url,options={})
# My stuff here
link_to(name,url,options)
end
alias_method :simple_link_to, :link_to_admin
如果我拨打link_to_admin
,我想面对一个问题,我想将值打印到<li>
标记
实施例
def link_to_admin(name,url,options={})
# My stuff here
menu = ""
menu << "<li> #{link_to(name,url,options)}</li>"
menu.html_safe
end
如果我致电simple_link_to
,则不需要<li>
代码。所以目前我正在传递一个options
,如li_required
,然后在我的方法中检查条件。这是完美的,我知道这是正确的方法。
def link_to_admin(name,url,options={})
menu = ""
menu << options[:li_required] ? "<li> #{link_to(name,url,options)}</li>" : link_to(name,url,options)
menu.html_safe
end
但是,在我尝试找到simple_method
或link_to_admin
之类的调用方法之前,我尝试过:
1.__method__
2.caller[0]=~/`(.*?)'/
这不能按预期工作。
我在simple_method
中调用link_to_admin
或layout
个方法,因此__method__
始终仅返回link_to_admin
。
但caller[0]=~/
(。*?)&#39; / if am calling from
布局means, it's returning layout path and if I am calling from any other
助手or
class`表示它正在返回当前方法。
还有其他方法来检查方法名称。
我知道这不是一个好问题,任何人都可以告诉我任何其他方式。
注意: - 我创建了alias_method,仅用于命名转换。除了添加<li>
标签之外,我没有做任何事情。
不仅在这里,我还有很长一段时间的怀疑。我知道我可以再定义一种方法,我可以做到。
离开我的场景,一般我想知道这个答案。
答案 0 :(得分:17)
使用__callee__
代替__method__
将获取正在运行的别名的名称。
答案 1 :(得分:3)
我建议,不要依赖于方法名称和分支(对于任何方法名称重构都会变得很脆弱,显然更复杂等等),你只需将方法分解为将共同逻辑抽象为共享方法
以下是我的写作方式:
def simple_link_to(name, url, options = {})
# shared_link_to(name) ... or whatever
link_to(name, url, options)
end
def link_to_admin(name, url, options = {})
# shared_link_to(name) ... or whatever
content_tag(:li) do
simple_link_to(name, url, options)
end
end
private
def shared_link_to(name)
# do whatever is common
end
注意:我已经猜到你有一些共同的代码,你想要抽象出一些方法(我称之为shared_link_to
)...但是做你需要的那部分。