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>标签.所以目前我正在通过一个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
Run Code Online (Sandbox Code Playgroud)
但是,在我试图找到像simple_method或之类的调用方法之前link_to_admin,我尝试过:
1.__method__
2.caller[0]=~/`(.*?)'/
Run Code Online (Sandbox Code Playgroud)
这没有按预期工作.
我在呼唤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>标签,我没有做任何事情.
不仅在这里,我还有很长一段时间的怀疑.我知道我可以再定义一种方法,我可以做到.
离开我的场景,一般我想知道这个答案.
我建议您不要依赖方法名称和分支(任何方法名称重构都会变得脆弱,显然更复杂等),而是简单地分解方法,将通用逻辑抽象为共享方法。
我会这样写:
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)...但是请对该部分执行您需要的操作。