我有一个名为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]=~/`(.*?)'/
这不是预期的工作
我在layout
中调用simple_method
或link_to_admin
方法,因此__method__
始终仅返回link_to_admin
。
但是caller[0]=~/
(.*?)'/if am calling from
layout means, it's returning layout path and if I am calling from any other
helper or
class '表示它返回当前方法。
还有其他方法可以检查方法名
我知道这不是一个好问题,有人能告诉我其他的方法吗?
注意:-我已经创建了alias_method命名转换仅。除了添加<li>
标签,我没有做任何事情。
不仅在这里,我很久以前就有这个疑问。我知道我可以再定义一个方法,我可以做到。
离开我的场景,一般我想知道这个答案。使用__callee__
而不是__method__
将获得正在运行的别名的名称
我建议,与其依赖方法名和分支(这在任何方法名重构中都会变得脆弱,显然会更复杂,等等),不如简单地分解方法,将公共逻辑抽象到一个共享的方法中。
我是这样写的:
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
)…但那部分你要怎么做就怎么做。