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

Jen*_*ish 5 ruby ruby-on-rails ruby-2.0 ruby-on-rails-4 ruby-2.1

我有方法调用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
Run Code Online (Sandbox Code Playgroud)

如果我打电话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
Run Code Online (Sandbox Code Playgroud)

如果我打电话simple_link_to不需要<li>标签.所以目前我正在通过一个optionsli_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
Run Code Online (Sandbox Code Playgroud)

但是,在我试图找到像simple_method或之类的调用方法之前link_to_admin,我尝试过:

1.__method__
2.caller[0]=~/`(.*?)'/
Run Code Online (Sandbox Code Playgroud)

这没有按预期工作.

我在呼唤simple_methodlink_to_admin方法,layout所以__method__总是link_to_admin只返回.

但是caller[0]=~/(.*?)'/ if am calling fromlayout means, it's returning layout path and if I am calling from any otherhelper orclass`意味着它返回当前方法.

任何其他方式是检查方法名称.

我知道这不是一个好问题,任何人都可以告诉我任何其他方式.

注意: - 我创建了alias_method仅用于命名转换.除了添加<li>标签,我没有做任何事情.

不仅在这里,我还有很长一段时间的怀疑.我知道我可以再定义一种方法,我可以做到.

离开我的场景,一般我想知道这个答案.

pol*_*tti 18

使用__callee__而不是__method__将获取正在运行的别名的名称.


pdo*_*obb 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
Run Code Online (Sandbox Code Playgroud)

注意:我猜测您有一些通用代码,您希望将其抽象为某种方法(我称之为shared_link_to)...但是请对该部分执行您需要的操作。