J'ai une configuration RESTful pour les routes dans une application Rails en utilisant des permaliens de texte comme ID pour les ressources.Valider aucun chevauchement de routage lors de la création de nouvelles ressources dans Ruby on Rails
En outre, il y a quelques itinéraires spéciaux nommés et qui se chevauchent avec la ressource nommée par exemple:
# bunch of special URLs for one off views to be exposed, not RESTful
map.connect '/products/specials', :controller => 'products', :action => 'specials'
map.connect '/products/new-in-stock', :controller => 'products', :action => 'new_in_stock'
# the real resource where the products are exposed at
map.resources :products
Le modèle Product
est d'utiliser permalink_fu pour générer permaliens en fonction du nom, et ProductsController
fait une recherche sur le champ permalien lors de l'accès. Tout fonctionne bien.
Cependant lors de la création de nouveaux Product
enregistrements dans la base de données, je veux valider que le permalien généré ne pas chevauchement avec une URL spéciale.
Si un utilisateur essaie de créer un produit nommé specials
ou new-in-stock
ou même un Rails normaux méthode de ressources RESTful comme new
ou edit
, je veux que le contrôleur lookup la configuration de routage, définissez des erreurs sur l'objet modèle, validation échoue pour la nouvel enregistrement, et ne pas l'enregistrer.
Je pourrais coder en dur une liste de noms permaliens illégaux connus, mais cela semble désordonné de le faire de cette façon. Je préférerais me connecter au routage pour le faire automatiquement.
(noms de contrôleur et le modèle a changé pour protéger les innocents et de le rendre plus facile de répondre, la configuration réelle est plus complexe que cet exemple)
Cela semble être le chemin à suivre, mais je ne m'inquiéterais pas d'avoir une logique de routage/contrôleur dans le modèle et d'essayer de le séparer. Le fait est que dans votre système, le modèle * dépend * du routage - ce n'est tout simplement pas un modèle valide s'il se heurte à une autre route. – ideasasylum