Je suis entrain de travailler sur une application en ruby on rails et il j’utilise les relations polymorphiques pour les héritages.

Après, vous pouvez utiliser les nested_form pour ne pas vous répéter sur la création des formulaires : DRY 🙂

Maintenant, supposons qu’on ait les modèles ChienChat et Rat qui héritent du modèle Animal où vous faites un belongs_to :entity, polymorphic: true pour l’héritage.

Si vous voulez créer un lien pour afficher les détails d’un animal il suffit de faire : <%= link_to animal.nom, animal.entity %> et le tour est joué.

Maintenant comment est ce qu’on va faire pour créer un lien pour éditer un animal ? Et pour la suppression ? Vous me direz <%= link_to 'modifier', edit_animal_path(animal) %> mais ce ne marchera que si on modifie tous les animaux sur un seul formulaire et là y aura beaucoup de conditions à vérifier pour afficher les champs qui concernent l’animal en question à moins que … je ne sais pas 🙂

Euh il y a une solution :

<% if @animal.entity.is_a?(Chien) %>
    <%= link_to 'modifier', edit_chien_path(animal.entity) %>
<% end %>
<% if @animal.entity.is_a?(Chat) %>
    <%= link_to 'modifier', edit_chat_path(animal.entity) %>
<% end %>
<% if @animal.entity.is_a?(Rat) %>
    <%= link_to 'modifier', edit_rat_path(animal.entity) %>
<% end %>

Mais, comme vous le constatez, cette solution n’est pas propre. C’est là qu’intervient notre cher polymorphic_url ou polymorphic_path qui va nous nettoyer tout ça :

<%= link_to 'modifier', edit_polymorphic_path(animal.entity) %>

hmmm ^_^ C’est magique non ?

Vous pouvez consulter la documentation pour plus de détails.