ruby on rails - ¿Cómo obtener el nombre del método de alias de llamada?
ruby-on-rails ruby-on-rails-4 (2)
El uso de __callee__
lugar de __method__
obtendrá el nombre del alias que se está ejecutando.
Estoy teniendo un método llamado link_to_admin
entonces tengo un alias de otro método llamado 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
Aquí estoy enfrentando un problema si llamo link_to_admin
, quiero imprimir el valor en la etiqueta <li>
Ex.
def link_to_admin(name,url,options={})
# My stuff here
menu = ""
menu << "<li> #{link_to(name,url,options)}</li>"
menu.html_safe
end
Y si llamo a simple_link_to
sin necesidad de la etiqueta <li>
. Por lo tanto, actualmente estoy pasando una options
como li_required
luego estoy comprobando la condición en mi método. Esto está funcionando perfectamente, sé que esta es la forma correcta de hacerlo.
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
Pero, antes de intentar encontrar el método de llamada como simple_method
o link_to_admin
, lo intenté con:
1.__method__
2.caller[0]=~/`(.*?)''/
Esto no está funcionando como se esperaba
Estoy llamando a los métodos simple_method
o link_to_admin
en el layout
por lo que __method__
siempre devuelve link_to_admin
only.
Pero caller[0]=~/
(. *?) ''/ if am calling from
diseño means, it''s returning layout path and if I am calling from any other
ayudante or
clase` significa que está devolviendo el método actual.
Cualquier otra forma es allí para verificar el nombre del método.
Sé que esta no es una buena pregunta, ¿podría alguien decirme de otra manera?
Nota: - He creado alias_method para nombrar solo la conversión. Además de agregar la etiqueta <li>
no estoy haciendo nada.
No solo aquí tengo esta duda desde hace mucho tiempo. Sé que puedo definir un método más y puedo hacerlo.
Deje mi escenario, generalmente quiero saber esta respuesta.
Yo recomendaría que, en lugar de confiar en los nombres de métodos y la bifurcación (que se vuelven frágiles con cualquier refactorización de nombres de métodos, obviamente es más complejo, etc.) simplemente separe los métodos para abstraer la lógica común en un método compartido.
Así es como lo escribiría:
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
Nota: he adivinado que tienes un código común que deseas abstraer en algún método (al que he llamado shared_link_to
) ... pero haz lo que necesites con esa parte.