Rails a través de una extensión de la clase Module en ActiveSupport permite delegar métodos de manera comoda. Veamos un ejemplo, para entenderlo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Interesante, pero con limitaciones. Probemos otras posibiliades:
1 2 3 4 5 6 7 8 9 10 |
|
El código causante de este comportamiento tiene la siguiente pinta:
1 2 3 4 5 6 7 8 9 10 |
|
Esto no nos agrada del todo, ya que lo interesante sería que se pudiesen escribir cosas como las siguientes sin preocuparse:
1 2 3 4 5 6 |
|
Aqui os pongo nuestro Module#delegate_method
que permite todo esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Esta versión se diferencia de Module#delegate_method
anterior en lo siguiente:
- No reescribimos el método original ya que la implementación no es compatible al 100% con la anterior. No soportamos la definición de multiples delegaciones y no queremeos que código ya escrito deje de funcionar. Si queremos delegar del modo Rails seguimos teniendo
Module#delegate
. La posibilidad de definir varias delegaciones en una sola sentencia no es una característica fundamental (para delegar muchos métodos a lo mejor compensa trastear con elmethod_missing
). - No chequeamos la existencia del parametro :to (presuponemos que vamos a escirbir correctamente el código y si no es asís ya saltará otra expceción.
- Permitimos delegar en un método diferente al método delegado. Esto es super útil como se vió en el ejemplo de productos y marcas.
- Si no existe el delegado o éste no tiene valor obtenemos
nil
y no una sucia excpeción, o lo que es mejor, obtenemos un valor por defecto.
Probemos de nuevo el código con el que abrimos el post sutituyendo delegate
por delegate_method
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Lo sentimos, pero los comentarios están cerrados