visual studio microsoft español descargar community ruby-on-rails ruby override helpers

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:

  1. 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.
  2. 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.
  3. 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