ruby-on-rails ruby ruby-on-rails-4 ruby-2.0 ruby-2.1

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.