6

我有一个方法被调用,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_methodor的调用方法之前link_to_admin,我尝试了:

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

这没有按预期工作。

我正在调用simple_method或调用link_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>标签之外,我没有做任何事情。

不仅在这里,很久以前就有这个疑问。我知道我可以再定义一种方法并且我可以做到。

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

4

2 回答 2

21

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

于 2014-11-14T19:33:35.243 回答
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)......但是用那部分做你需要的。

于 2014-05-22T12:22:15.903 回答