{"id":8458,"date":"2016-06-17T10:54:27","date_gmt":"2016-06-17T10:54:27","guid":{"rendered":"https:\/\/dev.railscarma.com\/how-to-add-functionality-to-ruby-classes-with-decorators\/"},"modified":"2021-06-06T12:05:55","modified_gmt":"2021-06-06T12:05:55","slug":"como-agregar-funcionalidad-a-las-clases-de-ruby-con-decoradores","status":"publish","type":"post","link":"https:\/\/www.railscarma.com\/es\/blog\/uncategorized\/como-agregar-funcionalidad-a-las-clases-de-ruby-con-decoradores\/","title":{"rendered":"C\u00f3mo agregar funcionalidad a las clases de Ruby con decoradores"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"8458\" class=\"elementor elementor-8458\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6fd970f1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6fd970f1\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-442169c1\" data-id=\"442169c1\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-766e4dc8 elementor-widget elementor-widget-text-editor\" data-id=\"766e4dc8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<span style=\"font-size: medium;\">Los decoradores nos permiten agregar comportamiento a los objetos en tiempo de ejecuci\u00f3n y no afectan a otros objetos de la clase. Los decoradores se pueden aplicar cuando necesite agregar y eliminar din\u00e1micamente responsabilidades a una clase. El patr\u00f3n decorador es una alternativa \u00fatil para crear subclases. Proporcionan funcionalidad adicional a una clase y al mismo tiempo mantienen la coherencia de la API p\u00fablica. Veamos un ejemplo para comprender la importancia de Ruby Decorators. <\/span>\n\n<span style=\"font-size: medium;\">Considere que tenemos una clase Tattoo con un m\u00e9todo de precio que devuelve 300.<\/span>\n<blockquote><span style=\"font-size: medium;\">Clase Tattoo def precio 300 final final<\/span><\/blockquote>\n<span style=\"font-size: medium;\">Ahora agregaremos un color adicional como caracter\u00edstica y el precio aumentar\u00eda en 150<\/span>\n\n<span style=\"font-size: medium;\">La forma m\u00e1s sencilla es crear una subclase TattooWithColour que devuelva 450 en el m\u00e9todo del precio.<\/span>\n<blockquote><span style=\"font-size: medium;\">clase TattooWithColour &lt; Tatuaje def precio 450 fin fin<\/span><\/blockquote>\n<span style=\"font-size: medium;\">A continuaci\u00f3n, debemos representar un tatuaje grande que suma 200 al precio de nuestros tatuajes. Podemos representar esto usando una subclase de Tattoo BigTattoo.<\/span>\n<blockquote><span style=\"font-size: medium;\">clase BigTattoo &lt; Tatuaje def precio 500 fin fin<\/span><\/blockquote>\n<span style=\"font-size: medium;\">Tambi\u00e9n podr\u00edamos tener tatuajes de mayor tama\u00f1o y podr\u00edan a\u00f1adir m\u00e1s precio a nuestro BigTattoo. Si tuvi\u00e9ramos que considerar que estos tipos de tatuajes podr\u00edan usarse con colores, necesitar\u00edamos agregar las subclases BigTattooWithColour y BiggerTattooWithColour.<\/span>\n\n<span style=\"font-size: medium;\">Con este m\u00e9todo, terminamos con un total de 6 clases. Incluso duplique ese n\u00famero si desea representar estas combinaciones con dise\u00f1os adicionales en el tatuaje.<\/span>\n<h1 class=\"western\"><a name=\"h.m63nvlo5wb6n\"><\/a> <span style=\"font-family: Calibri,serif;\"><span style=\"font-size: medium;\"><b>Heredar din\u00e1micamente con m\u00f3dulos<\/b><\/span><\/span><\/h1>\n<span style=\"font-family: Calibri,serif;\"><span style=\"font-size: medium;\">Para simplificar nuestro c\u00f3digo, podemos usar m\u00f3dulos para agregar din\u00e1micamente comportamiento a nuestra clase Tattoo. Escribamos los m\u00f3dulos ColourTattoo y BigTattoo para esto.<\/span><\/span>\n<blockquote><span style=\"font-size: medium;\">m\u00f3dulo ColourTattoo def precio super + 150 final final<\/span><\/blockquote>\n<blockquote>m\u00f3dulo BigTattoo def precio super + 200 final final<\/blockquote>\n<span style=\"font-size: medium;\">Ahora podemos extender nuestros objetos de tatuaje din\u00e1micamente usando el m\u00e9todo Object#extend.<\/span>\n\n<span style=\"font-size: medium;\">tatuaje = Tatuaje.nuevo tatuaje.extend(ColorTattoo) tatuaje.extend(BigTattoo) <\/span>\n\n<span style=\"font-size: medium;\">Esta es una buena mejora con respecto a nuestra implementaci\u00f3n basada en herencia. En lugar de tener subclases, solo tenemos una clase y 3 m\u00f3dulos. Si necesit\u00e1ramos agregar dise\u00f1o adicional a la ecuaci\u00f3n, necesitar\u00edamos solo cuatro m\u00f3dulos en lugar de 12 clases.<\/span>\n<h1 class=\"western\"><a name=\"h.wafqjdfxo3j0\"><\/a> <span style=\"font-size: medium;\"><b>Aplicando el patr\u00f3n decorador<\/b><\/span><\/h1>\n<span style=\"font-size: medium;\">Esta soluci\u00f3n basada en m\u00f3dulos ha simplificado enormemente nuestro c\u00f3digo, pero a\u00fan podemos mejorarlo usando el decorador. Consideraremos un BiggerTatto como el que se forma sumando dos veces 150 al coste de un Tatuaje.<\/span>\n\n<span style=\"font-size: medium;\">No podemos hacer esto con nuestro enfoque basado en m\u00f3dulos. Ser\u00eda tentador llamar a tattoo.extend(BigTattoo) dos veces para obtener BiggerTattoo. Extender el m\u00f3dulo por segunda vez no tiene ning\u00fan efecto cuando ya hemos usado los extendidos.<\/span>\n\n<span style=\"font-size: medium;\">Si continu\u00e1ramos usando la misma implementaci\u00f3n, necesitar\u00edamos tener un m\u00f3dulo BiggerTattoo que devuelva super + 300 como costo. En su lugar, podemos usar un decorador que se puede componer para construir objetos complejos. Comenzamos con un decorador llamado BigTattoo que envuelve un objeto Tattoo.<\/span>\n<blockquote><span style=\"font-size: medium;\">clase BigTatto def inicializar (tatuaje) @tattoo = final del tatuaje<\/span><\/blockquote>\n<blockquote>def precio @tattoo.price + 150 fin fin<\/blockquote>\n<span style=\"font-size: medium;\">Ahora se puede crear un tatuaje m\u00e1s grande usando este contenedor dos veces en un objeto de tatuaje.<\/span>\n\n<span style=\"font-size: medium;\">tatuaje = Tatuaje.nuevo big_tattoo= BigTattoo.new(tatuaje) m\u00e1s grande_tattoo = BigTattoo.new(big_tattoo)<\/span>\n\n<span style=\"font-size: medium;\">De manera similar, podemos representar un tatuaje en color usando un decorador TattooWithColour. Usando s\u00f3lo tres clases, ahora podemos representar 6 tipos de tatuajes.<\/span>\n\n<span style=\"font-size: medium;\">Con una amplia experiencia en todas las facetas del desarrollo de Ruby On Rails, en <a href=\"https:\/\/www.railscarma.com\/es\/\">Railscarma<\/a>, le ofrecemos una amplia gama de servicios para ayudarle a implementar una estrategia integral personalizada para comunicarse con sus prospectos y sus clientes en el momento adecuado, a trav\u00e9s de los canales correctos. Para m\u00e1s detalles<a href=\"\/es\/contactenos\/\"> Cont\u00e1ctenos.<\/a><\/span>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6c5bbaf8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6c5bbaf8\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5f199228\" data-id=\"5f199228\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9bd6b46 elementor-widget elementor-widget-heading\" data-id=\"9bd6b46\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Suscr\u00edbete para recibir las \u00faltimas actualizaciones<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4adf8479 elementor-widget elementor-widget-shortcode\" data-id=\"4adf8479\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\t\t\t\t\t<script type=\"text\/javascript\">\n\t\t\t\t\t\tvar gCaptchaSibWidget;\n                        var onloadSibCallbackInvisible = function () {\n\n                            var element = document.getElementsByClassName('sib-default-btn');\n                            var countInvisible = 0;\n                            var indexArray = [];\n                            jQuery('.sib-default-btn').each(function (index, el) {\n                                if ((jQuery(el).attr('id') == \"invisible\")) {\n                                    indexArray[countInvisible] = index;\n                                    countInvisible++\n                                }\n                            });\n\n                            jQuery('.invi-recaptcha').each(function (index, el) {\n                                grecaptcha.render(element[indexArray[index]], {\n                                    'sitekey': jQuery(el).attr('data-sitekey'),\n                                    'callback': sibVerifyCallback,\n                                });\n                            });\n                        };\n\t\t\t\t\t<\/script>\n\t\t\t\t\t                <script src=\"https:\/\/www.google.com\/recaptcha\/api.js?onload=onloadSibCallbackInvisible&render=explicit\" async defer><\/script>\n\t\t\t\t\n\t\t\t<form id=\"sib_signup_form_1\" method=\"post\" class=\"sib_signup_form\" action=\"\">\n\t\t\t\t<div class=\"sib_loader\" style=\"display:none;\"><img\n\t\t\t\t\t\t\tsrc=\"https:\/\/www.railscarma.com\/wp-includes\/images\/spinner.gif\" alt=\"cargador\"><\/div>\n\t\t\t\t<input type=\"hidden\" name=\"sib_form_action\" value=\"subscribe_form_submit\">\n\t\t\t\t<input type=\"hidden\" name=\"sib_form_id\" value=\"1\">\n                <input type=\"hidden\" name=\"sib_form_alert_notice\" value=\"Please fill out this field\">\n                <input type=\"hidden\" name=\"sib_form_invalid_email_notice\" value=\"Your email address is invalid\">\n                <input type=\"hidden\" name=\"sib_security\" value=\"d7f7626ab9\">\n\t\t\t\t<div class=\"sib_signup_box_inside_1\">\n\t\t\t\t\t<div style=\"\/*display:none*\/\" class=\"sib_msg_disp\">\n\t\t\t\t\t<\/div>\n                                            <div id=\"sib_captcha_invisible\" class=\"invi-recaptcha\" data-sitekey=\"6LdikOAaAAAAAJ6SWrrKVQrtw7TQpQAEnv0HS0G3\"><\/div>\n                    \t\t\t\t\t<p class=\"sib-email-area\">\r\n    <label class=\"sib-email-area\"><\/label>\r\n    <input type=\"email\" class=\"sib-email-area\" name=\"email\" required=\"required\" placeholder=\"Direcci\u00f3n de correo electr\u00f3nico\">\r\n<\/p>\r\n<p class=\"sib-NAME-area\">\r\n    <label class=\"sib-NAME-area\"><\/label>\r\n    <input type=\"text\" class=\"sib-NAME-area\" name=\"NAME\" placeholder=\"Nombre\">\r\n<\/p>\r\n<p>\r\n    <input type=\"submit\" id=\"invisible\" class=\"sib-default-btn\" value=\"Suscribir\">\r\n<\/p>\t\t\t\t<\/div>\n\t\t\t<input type=\"hidden\" name=\"trp-form-language\" value=\"es\"\/><\/form>\n\t\t\t<style>\n\t\t\t\tform#sib_signup_form_1 p.sib-alert-message {\n    padding: 6px 12px;\n    margin-bottom: 20px;\n    border: 1px solid transparent;\n    border-radius: 4px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n}\nform#sib_signup_form_1 p.sib-alert-message-error {\n    background-color: #f2dede;\n    border-color: #ebccd1;\n    color: #a94442;\n}\nform#sib_signup_form_1 p.sib-alert-message-success {\n    background-color: #dff0d8;\n    border-color: #d6e9c6;\n    color: #3c763d;\n}\nform#sib_signup_form_1 p.sib-alert-message-warning {\n    background-color: #fcf8e3;\n    border-color: #faebcc;\n    color: #8a6d3b;\n}\n\t\t\t<\/style>\n\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t  <div class=\"related-post slider\">\r\n        <div class=\"headline\">Art\u00edculos Relacionados<\/div>\r\n    <div class=\"post-list owl-carousel\">\r\n\r\n            <div class=\"item\">\r\n            <div class=\"thumb post_thumb\">\r\n    <a  title=\"Gema Kaminari\" href=\"https:\/\/www.railscarma.com\/es\/blog\/articulos-tecnicos\/gema-kaminari\/?related_post_from=37277\">\r\n\r\n      <img decoding=\"async\" width=\"800\" height=\"300\" src=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2023\/04\/kaminari-gem.jpg\" class=\"attachment-full size-full wp-post-image\" alt=\"gema kaminari\" srcset=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2023\/04\/kaminari-gem.jpg 800w, https:\/\/www.railscarma.com\/wp-content\/uploads\/2023\/04\/kaminari-gem-300x113.jpg 300w, https:\/\/www.railscarma.com\/wp-content\/uploads\/2023\/04\/kaminari-gem-768x288.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n\r\n    <\/a>\r\n  <\/div>\r\n\r\n  <a class=\"title post_title\"  title=\"Gema Kaminari\" href=\"https:\/\/www.railscarma.com\/es\/blog\/articulos-tecnicos\/gema-kaminari\/?related_post_from=37277\">\r\n        Gema Kaminari  <\/a>\r\n\r\n        <\/div>\r\n              <div class=\"item\">\r\n            <div class=\"thumb post_thumb\">\r\n    <a  title=\"\u00bfPor qu\u00e9 contratar desarrolladores Ruby on Rails en 2026?\" href=\"https:\/\/www.railscarma.com\/es\/blog\/ror\/por-que-contratar-desarrolladores-de-ruby-on-rails\/?related_post_from=30627\">\r\n\r\n      <img decoding=\"async\" width=\"800\" height=\"300\" src=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2019\/01\/why-to-hire-ruby-on-rails-developers-in-2022.jpg\" class=\"attachment-full size-full wp-post-image\" alt=\"por qu\u00e9 contratar desarrolladores de Ruby on Rails en 2022\" srcset=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2019\/01\/why-to-hire-ruby-on-rails-developers-in-2022.jpg 800w, https:\/\/www.railscarma.com\/wp-content\/uploads\/2019\/01\/why-to-hire-ruby-on-rails-developers-in-2022-300x113.jpg 300w, https:\/\/www.railscarma.com\/wp-content\/uploads\/2019\/01\/why-to-hire-ruby-on-rails-developers-in-2022-768x288.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n\r\n    <\/a>\r\n  <\/div>\r\n\r\n  <a class=\"title post_title\"  title=\"\u00bfPor qu\u00e9 contratar desarrolladores Ruby on Rails en 2026?\" href=\"https:\/\/www.railscarma.com\/es\/blog\/ror\/por-que-contratar-desarrolladores-de-ruby-on-rails\/?related_post_from=30627\">\r\n        \u00bfPor qu\u00e9 contratar desarrolladores Ruby on Rails en 2026?  <\/a>\r\n\r\n        <\/div>\r\n              <div class=\"item\">\r\n            <div class=\"thumb post_thumb\">\r\n    <a  title=\"Importancia de la arquitectura de software en el desarrollo de software empresarial\" href=\"https:\/\/www.railscarma.com\/es\/blog\/ror\/importancia-de-la-arquitectura-de-software-en-el-desarrollo-de-software-empresarial\/?related_post_from=36250\">\r\n\r\n      <img decoding=\"async\" width=\"800\" height=\"300\" src=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2022\/06\/Importance-of-Software-Architecture-in-enterprise-software-development.jpg\" class=\"attachment-full size-full wp-post-image\" alt=\"Importancia de la arquitectura de software en el desarrollo de software empresarial\" srcset=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2022\/06\/Importance-of-Software-Architecture-in-enterprise-software-development.jpg 800w, https:\/\/www.railscarma.com\/wp-content\/uploads\/2022\/06\/Importance-of-Software-Architecture-in-enterprise-software-development-300x113.jpg 300w, https:\/\/www.railscarma.com\/wp-content\/uploads\/2022\/06\/Importance-of-Software-Architecture-in-enterprise-software-development-768x288.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n\r\n    <\/a>\r\n  <\/div>\r\n\r\n  <a class=\"title post_title\"  title=\"Importancia de la arquitectura de software en el desarrollo de software empresarial\" href=\"https:\/\/www.railscarma.com\/es\/blog\/ror\/importancia-de-la-arquitectura-de-software-en-el-desarrollo-de-software-empresarial\/?related_post_from=36250\">\r\n        Importancia de la arquitectura de software en el desarrollo de software empresarial  <\/a>\r\n\r\n        <\/div>\r\n              <div class=\"item\">\r\n            <div class=\"thumb post_thumb\">\r\n    <a  title=\"Ruby IDE: los mejores IDE para el desarrollo de Ruby on Rails\" href=\"https:\/\/www.railscarma.com\/es\/blog\/ror\/ruby-ide-las-mejores-ideas-para-el-desarrollo-de-ruby-on-rails\/?related_post_from=36125\">\r\n\r\n      <img decoding=\"async\" width=\"800\" height=\"300\" src=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2022\/01\/BEST-IDES-FOR-RUBY-ON-RAILS-DEVELOPMENT.jpg\" class=\"attachment-full size-full wp-post-image\" alt=\"MEJORES IDES PARA EL DESARROLLO DE RUBY ON RAILS\" srcset=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2022\/01\/BEST-IDES-FOR-RUBY-ON-RAILS-DEVELOPMENT.jpg 800w, https:\/\/www.railscarma.com\/wp-content\/uploads\/2022\/01\/BEST-IDES-FOR-RUBY-ON-RAILS-DEVELOPMENT-300x113.jpg 300w, https:\/\/www.railscarma.com\/wp-content\/uploads\/2022\/01\/BEST-IDES-FOR-RUBY-ON-RAILS-DEVELOPMENT-768x288.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\r\n\r\n    <\/a>\r\n  <\/div>\r\n\r\n  <a class=\"title post_title\"  title=\"Ruby IDE: los mejores IDE para el desarrollo de Ruby on Rails\" href=\"https:\/\/www.railscarma.com\/es\/blog\/ror\/ruby-ide-las-mejores-ideas-para-el-desarrollo-de-ruby-on-rails\/?related_post_from=36125\">\r\n        Ruby IDE: los mejores IDE para el desarrollo de Ruby on Rails  <\/a>\r\n\r\n        <\/div>\r\n      \r\n  <\/div>\r\n\r\n  <script>\r\n      <\/script>\r\n  <style>\r\n    .related-post {}\r\n\r\n    .related-post .post-list {\r\n      text-align: left;\r\n          }\r\n\r\n    .related-post .post-list .item {\r\n      margin: 10px;\r\n      padding: 10px;\r\n          }\r\n\r\n    .related-post .headline {\r\n      font-size: 14px !important;\r\n      color: #999999 !important;\r\n          }\r\n\r\n    .related-post .post-list .item .post_thumb {\r\n      max-height: 220px;\r\n      margin: 10px 0px;\r\n      padding: 0px;\r\n      display: block;\r\n          }\r\n\r\n    .related-post .post-list .item .post_title {\r\n      font-size: 14px;\r\n      color: #000000;\r\n      margin: 10px 0px;\r\n      padding: 0px;\r\n      display: block;\r\n      text-decoration: none;\r\n          }\r\n\r\n    .related-post .post-list .item .post_excerpt {\r\n      font-size: 12px;\r\n      color: #3f3f3f;\r\n      margin: 10px 0px;\r\n      padding: 0px;\r\n      display: block;\r\n      text-decoration: none;\r\n          }\r\n\r\n    .related-post .owl-dots .owl-dot {\r\n          }\r\n\r\n      <\/style>\r\n      <script>\r\n      jQuery(document).ready(function($) {\r\n        $(\".related-post .post-list\").owlCarousel({\r\n          items: 2,\r\n          responsiveClass: true,\r\n          responsive: {\r\n            0: {\r\n              items: 1,\r\n            },\r\n            768: {\r\n              items: 2,\r\n            },\r\n            1200: {\r\n              items: 2,\r\n            }\r\n          },\r\n                      rewind: true,\r\n                                loop: true,\r\n                                center: false,\r\n                                autoplay: true,\r\n            autoplayHoverPause: true,\r\n                                nav: true,\r\n            navSpeed: 1000,\r\n            navText: ['<i class=\"fas fa-chevron-left\"><\/i>', '<i class=\"fas fa-chevron-right\"><\/i>'],\r\n                                dots: false,\r\n            dotsSpeed: 1200,\r\n                                                    rtl: false,\r\n          \r\n        });\r\n      });\r\n    <\/script>\r\n  <\/div>","protected":false},"excerpt":{"rendered":"<p>Decorators allow us to add behavior to objects in runtime and don\u2019t affect other objects of the class. Decorators can be applied when you need to dynamically add and remove responsibility to a class. The decorator pattern is a helpful alternative to creating sub-classes. They give additional functionality to a class while still keeping the &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/www.railscarma.com\/es\/blog\/ruby-regex-match-guide-with-examples\/\"> <span class=\"screen-reader-text\">Ruby Regex Match Guide (2026) con Ejemplos<\/span> Leer m\u00e1s \u00bb<\/a><\/p>","protected":false},"author":1,"featured_media":31904,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[384,1],"tags":[],"class_list":["post-8458","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technical-articles","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Add Functionality to Ruby Classes with Decorators - RailsCarma - Ruby on Rails Development Company specializing in Offshore Development<\/title>\n<meta name=\"description\" content=\"Decorators allow us to add behavior to objects in runtime and don\u2019t affect other objects of the class. Decorators can be applied when you need to\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.railscarma.com\/es\/blog\/uncategorized\/como-agregar-funcionalidad-a-las-clases-de-ruby-con-decoradores\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Add Functionality to Ruby Classes with Decorators - RailsCarma - Ruby on Rails Development Company specializing in Offshore Development\" \/>\n<meta property=\"og:description\" content=\"Decorators allow us to add behavior to objects in runtime and don\u2019t affect other objects of the class. Decorators can be applied when you need to\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.railscarma.com\/es\/blog\/uncategorized\/como-agregar-funcionalidad-a-las-clases-de-ruby-con-decoradores\/\" \/>\n<meta property=\"og:site_name\" content=\"RailsCarma - Ruby on Rails Development Company specializing in Offshore Development\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/RailsCarma\/\" \/>\n<meta property=\"article:published_time\" content=\"2016-06-17T10:54:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-06-06T12:05:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@railscarma\" \/>\n<meta name=\"twitter:site\" content=\"@railscarma\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/www.railscarma.com\/#\/schema\/person\/5f2228a2dec7549056e709de6eb85d21\"},\"headline\":\"How to Add Functionality to Ruby Classes with Decorators\",\"datePublished\":\"2016-06-17T10:54:27+00:00\",\"dateModified\":\"2021-06-06T12:05:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/\"},\"wordCount\":593,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.railscarma.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg\",\"articleSection\":[\"Technical Articles\",\"Uncategorized\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/\",\"url\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/\",\"name\":\"How to Add Functionality to Ruby Classes with Decorators - RailsCarma - Ruby on Rails Development Company specializing in Offshore Development\",\"isPartOf\":{\"@id\":\"https:\/\/www.railscarma.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg\",\"datePublished\":\"2016-06-17T10:54:27+00:00\",\"dateModified\":\"2021-06-06T12:05:55+00:00\",\"description\":\"Decorators allow us to add behavior to objects in runtime and don\u2019t affect other objects of the class. Decorators can be applied when you need to\",\"breadcrumb\":{\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#primaryimage\",\"url\":\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg\",\"contentUrl\":\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg\",\"width\":800,\"height\":300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.railscarma.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Add Functionality to Ruby Classes with Decorators\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.railscarma.com\/#website\",\"url\":\"https:\/\/www.railscarma.com\/\",\"name\":\"RailsCarma - Ruby on Rails Development Company specializing in Offshore Development\",\"description\":\"RailsCarma is a Ruby on Rails Development Company in Bangalore. We specialize in Offshore Ruby on Rails Development based out in USA and India. Hire experienced Ruby on Rails developers for the ultimate Web Experience.\",\"publisher\":{\"@id\":\"https:\/\/www.railscarma.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.railscarma.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.railscarma.com\/#organization\",\"name\":\"RailsCarma\",\"url\":\"https:\/\/www.railscarma.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.railscarma.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2020\/08\/railscarma_logo.png\",\"contentUrl\":\"https:\/\/www.railscarma.com\/wp-content\/uploads\/2020\/08\/railscarma_logo.png\",\"width\":200,\"height\":46,\"caption\":\"RailsCarma\"},\"image\":{\"@id\":\"https:\/\/www.railscarma.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/RailsCarma\/\",\"https:\/\/x.com\/railscarma\",\"https:\/\/www.linkedin.com\/company\/railscarma\/\",\"https:\/\/myspace.com\/railscarma\",\"https:\/\/in.pinterest.com\/railscarma\/\",\"https:\/\/www.youtube.com\/channel\/UCx3Wil-aAnDARuatTEyMdpg\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.railscarma.com\/#\/schema\/person\/5f2228a2dec7549056e709de6eb85d21\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.railscarma.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/308867ca6c81f3aba146080c601000087180326f752c4116849ea9f514c6a4fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/308867ca6c81f3aba146080c601000087180326f752c4116849ea9f514c6a4fa?s=96&d=mm&r=g\",\"caption\":\"admin\"},\"sameAs\":[\"https:\/\/www.railscarma.com\/hire-ruby-on-rails-developer\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C\u00f3mo agregar funcionalidad a las clases de Ruby con decoradores - RailsCarma - Empresa de desarrollo Ruby on Rails especializada en desarrollo offshore","description":"Los decoradores nos permiten agregar comportamiento a los objetos en tiempo de ejecuci\u00f3n y no afectan a otros objetos de la clase. Los decoradores se pueden aplicar cuando sea necesario.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.railscarma.com\/es\/blog\/uncategorized\/como-agregar-funcionalidad-a-las-clases-de-ruby-con-decoradores\/","og_locale":"es_ES","og_type":"article","og_title":"How to Add Functionality to Ruby Classes with Decorators - RailsCarma - Ruby on Rails Development Company specializing in Offshore Development","og_description":"Decorators allow us to add behavior to objects in runtime and don\u2019t affect other objects of the class. Decorators can be applied when you need to","og_url":"https:\/\/www.railscarma.com\/es\/blog\/uncategorized\/como-agregar-funcionalidad-a-las-clases-de-ruby-con-decoradores\/","og_site_name":"RailsCarma - Ruby on Rails Development Company specializing in Offshore Development","article_publisher":"https:\/\/www.facebook.com\/RailsCarma\/","article_published_time":"2016-06-17T10:54:27+00:00","article_modified_time":"2021-06-06T12:05:55+00:00","og_image":[{"width":800,"height":300,"url":"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_creator":"@railscarma","twitter_site":"@railscarma","twitter_misc":{"Escrito por":"admin","Tiempo de lectura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#article","isPartOf":{"@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/"},"author":{"name":"admin","@id":"https:\/\/www.railscarma.com\/#\/schema\/person\/5f2228a2dec7549056e709de6eb85d21"},"headline":"How to Add Functionality to Ruby Classes with Decorators","datePublished":"2016-06-17T10:54:27+00:00","dateModified":"2021-06-06T12:05:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/"},"wordCount":593,"commentCount":0,"publisher":{"@id":"https:\/\/www.railscarma.com\/#organization"},"image":{"@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#primaryimage"},"thumbnailUrl":"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg","articleSection":["Technical Articles","Uncategorized"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/","url":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/","name":"C\u00f3mo agregar funcionalidad a las clases de Ruby con decoradores - RailsCarma - Empresa de desarrollo Ruby on Rails especializada en desarrollo offshore","isPartOf":{"@id":"https:\/\/www.railscarma.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#primaryimage"},"image":{"@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#primaryimage"},"thumbnailUrl":"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg","datePublished":"2016-06-17T10:54:27+00:00","dateModified":"2021-06-06T12:05:55+00:00","description":"Los decoradores nos permiten agregar comportamiento a los objetos en tiempo de ejecuci\u00f3n y no afectan a otros objetos de la clase. Los decoradores se pueden aplicar cuando sea necesario.","breadcrumb":{"@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#primaryimage","url":"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg","contentUrl":"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/06\/ror-development-1.jpg","width":800,"height":300},{"@type":"BreadcrumbList","@id":"https:\/\/www.railscarma.com\/de\/blog\/uncategorized\/so-fugen-sie-ruby-klassen-mithilfe-von-dekoratoren-funktionalitat-hinzu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.railscarma.com\/"},{"@type":"ListItem","position":2,"name":"How to Add Functionality to Ruby Classes with Decorators"}]},{"@type":"WebSite","@id":"https:\/\/www.railscarma.com\/#website","url":"https:\/\/www.railscarma.com\/","name":"RailsCarma - Empresa de desarrollo Ruby on Rails especializada en desarrollo offshore","description":"RailsCarma es una empresa de desarrollo de Ruby on Rails en Bangalore. Nos especializamos en el desarrollo offshore de Ruby on Rails con sede en EE. UU. e India. Contrate desarrolladores experimentados de Ruby on Rails para disfrutar de la mejor experiencia web.","publisher":{"@id":"https:\/\/www.railscarma.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.railscarma.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.railscarma.com\/#organization","name":"RielesCarma","url":"https:\/\/www.railscarma.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.railscarma.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.railscarma.com\/wp-content\/uploads\/2020\/08\/railscarma_logo.png","contentUrl":"https:\/\/www.railscarma.com\/wp-content\/uploads\/2020\/08\/railscarma_logo.png","width":200,"height":46,"caption":"RailsCarma"},"image":{"@id":"https:\/\/www.railscarma.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/RailsCarma\/","https:\/\/x.com\/railscarma","https:\/\/www.linkedin.com\/company\/railscarma\/","https:\/\/myspace.com\/railscarma","https:\/\/in.pinterest.com\/railscarma\/","https:\/\/www.youtube.com\/channel\/UCx3Wil-aAnDARuatTEyMdpg"]},{"@type":"Person","@id":"https:\/\/www.railscarma.com\/#\/schema\/person\/5f2228a2dec7549056e709de6eb85d21","name":"administraci\u00f3n","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.railscarma.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/308867ca6c81f3aba146080c601000087180326f752c4116849ea9f514c6a4fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/308867ca6c81f3aba146080c601000087180326f752c4116849ea9f514c6a4fa?s=96&d=mm&r=g","caption":"admin"},"sameAs":["https:\/\/www.railscarma.com\/hire-ruby-on-rails-developer\/"]}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/posts\/8458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/comments?post=8458"}],"version-history":[{"count":0,"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/posts\/8458\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/media\/31904"}],"wp:attachment":[{"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/media?parent=8458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/categories?post=8458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.railscarma.com\/es\/wp-json\/wp\/v2\/tags?post=8458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}