ruby on rails - studio - Anular guías de acceso con acceso a originales
visual studio installer (4)
Quiero usar los ayudantes familiares de los rieles, pero con una funcionalidad ligeramente modificada. A mi modo de ver, quiero poder hacer algo como:
module AwesomeHelper
#... create alias of stylesheet_link_tag to old_stylesheet_link_tag
def stylesheet_link_tag(*args)
if @be_awesome
awesome_stylesheet_link_tag *args
else
old_stylesheet_link_tag *args
end
end
end
A mi modo de ver, tengo tres opciones:
- Mono parcheado: reapertura del módulo de ayuda de rieles. Si el equipo de rieles cambia el nombre de su módulo de ayuda, mi código se convierte en una fuente de fragilidad. No es insuperable, pero no ideal.
- Use diferentes nombres de métodos: tratar de mantener la interfaz de rieles comunes puede ser mi perdición. Mis cambios pueden convertirse en una fuente de confusión para otros desarrolladores.
- Métodos de separación (nuevos): no estoy seguro si esto funcionaría o si tendría los mismos inconvenientes que 1. Investigaré esto, pero este podría ser un buen punto de partida.
Entonces, la pregunta aquí es: ¿estoy atascado con una de estas soluciones subóptimas, o hay alguna otra forma que no haya considerado? Si opto por la opción 3, ¿hay alguna forma de hacerlo sin dirigirme directamente al módulo de ayuda de los rieles?
(Nota: he eliminado el contexto, ya que no agrega nada a la pregunta).
Hay una mejor manera que cualquiera de sus opciones enumeradas. Solo usa super
:
module AwesomeHelper
def stylesheet_link_tag(*sources)
if @be_awesome
awesome_stylesheet_link_tag *sources
else
super
end
end
end
La anulación de stylesheet_link_tag
en AwesomeHelper asegurará que, cuando se invoque stylesheet_link_tag
, Ruby lo encuentre en la ruta de búsqueda de métodos antes de que ActionView::Helpers::AssetTagHelper
. Si @be_awesome
es true
, puede hacerse cargo y detener las cosas allí mismo, y si no, la llamada a super
sin paréntesis pasará de manera transparente a través de todos los argumentos hasta la implementación de Rails. De esta manera, ¡no tienes que preocuparte por que el equipo central de Rails te mueva las cosas!
No uso esta gema, así que te responderé de una manera más genérica.
Supongamos que desea registrar las llamadas a link_to
helper (sí, ejemplo artificial, pero muestra la idea). Buscar en la API le permite comprender ese link_to
ubicado en el ActionView::Helpers::UrlHelper
. Entonces, creas un archivo en tu, digamos, config/initializers
directorio con los siguientes contenidos:
# like in config/initializers/link_to_log.rb
module ActionView::Helpers::UrlHelper
def link_to_with_log(*args, &block)
logger.info ''**** LINK_TO CALL ***''
link_to_without_log(*args, &block) # calling the original helper
end
alias_method_chain :link_to, :log
end
El núcleo de esta funcionalidad - alias_method_chain
( alias_method_chain
). Úsalo DESPUÉS de definir el método xxx_with_feature
.
Realmente lo alentaría a considerar su opción # 2, anulando el comportamiento de los métodos de rieles de una manera que sea obvia para la persona que llama.
Tu nuevo método debería llamarse awesome_stylesheet_link_tag
para que otros desarrolladores de Rails puedan leer tu código y hacer la pregunta "¿Qué tiene de increíble la etiqueta de enlace?".
Como un cambio menor, puede hacer la anulación pero pasar :awesome => true
como un argumento para que al menos tengan una idea de que algo está en marcha.
Cambiar el comportamiento de un método ampliamente utilizado como stylesheet_link_tag
crea un posible malentendido en el futuro donde no se necesita ninguno.
Trate de usar alias_method
:
module AwesomeHelper
alias_method :original_stylesheet_link_tag, :stylesheet_link_tag
def stylesheet_link_tag(*sources)
if @be_awesome
awesome_stylesheet_link_tag *sources
else
original_stylesheet_link_tag *sources
end
end
end