如何获取调用别名方法的名称



我有一个名为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_methodlink_to_admin这样的调用方法之前,所以我尝试了:

1.__method__
2.caller[0]=~/`(.*?)'/

这不是预期的工作

我在layout中调用simple_methodlink_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)…但那部分你要怎么做就怎么做。

最新更新