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

时间:2014-05-22 12:16:31

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-2.0 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

如果我拨打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]=~/`(.*?)'/

这不能按预期工作。

我在simple_method中调用link_to_adminlayout个方法,因此__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>标签之外,我没有做任何事情。

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

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

2 个答案:

答案 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)...但是做你需要的那部分。