Itinéraires dynamiques avec Rails 3
J'ai une tâche de développer une application rails, suivant le modèle de routage.
J'ai besoin d'avoir PageController
et Page
modèle. Url de Page doit être comme /contacts, /shipping, /some_page
.
Aussi j'ai besoin d'avoir CatalogController
et Category
modèle. Catégories d'url doit être comme /laptops, /smartphones/android
.
Et il sera ProductsController
et Product
modèle, les url des produits doit être ligne /laptops/toshiba_sattelite_l605
/smartphones/android/htc_magic
Je comprends que ce problème peut être résolu en utilisant des URLs comme
/page/shipping
/catalog/smartphones/android
Mais le client ne veut pas voir l'insertion de "/page
" ou "/catalog
" dans l'URL.
S'il vous plaît dites-moi le sens de la résolution de ce problème.
Désolé pour mon mauvais anglais.
source d'informationauteur Beer Brother
Vous devez vous connecter pour publier un commentaire.
Vous aurez à écrire un "fourre-tout" de la règle:
Sur les routes.rb:
Votre précieux contrôleur:
Ensuite, vous écrivez une vue pour chaque "type" de l'élément: produit.html.erb, de la catégorie.html.erb, etc.
Assurez-vous d'écrire votre
find_by_slug
mise en œuvre.Vous pouvez modifier
one_action_to_rule_them_all
àpikachu_i_choose_you
etSauronController
àPokemonController
sera trop de travail.Vous avez besoin d'écrire un fourre-tout
alors en charge le chemin d'accès de page dans votre contrôleur de la page
si vous utilisez Omniauth ou l'autre des rails lib qui utilise ses propres attraper tout ce que vous devez exclure certaines url de cela, utilisez un lambda de votre contrainte
Si vous voulez avoir imbriqués les chemins (par exemple, les "smartphones/android"), vous devez diviser le :page param part et gérer les segments de tracé dans votre contrôleur
J'ai trouvé ce guide de rails 3 routage incroyablement utile:
http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/
j'ai fait cela à la combinaison de deux approches
utilisation friendly_id gem pour fonctionner avec les limaces dans les requêtes de recherche plutôt que des id numériques
définir des itinéraires avec
:constraints=>ConditionClass
qui a pour revenirtrue
oufalse
(si la route sera déterminé ou non)petit exemple:
bien sûr, vous pouvez acheminer vers un autre contrôleur de rendre un autre point de vue
get '/:whatever' => 'another_controller#another_action', :constraints=>ConditionClassN
espère que cela aide!
acclamations
Rails routes sont fondées uniquement sur des URL. Si vous n'avez pas
/pages
ou/categories
ou que ce soit avant le nom, alors comment est-Rails va dire si une URL commehttp://example.com/smartphones
est une URL de la page ou de la catégorie d'URL? Sauf si vous avez une liste prédéfinie de pages de noms dans les itinéraires, les conditions, il ne peut pas.La seule façon de le faire que dans cet exemple serait à chercher une page par
smartphones
et si aucun n'est trouvé supposer que c'est un nom de catégorie et de recherche pour une catégorie. Ce ne peut pas être fait dans les rails des voies. Pour ce faire, vous aurez besoin d'un contrôleur unique qui permettrait de gérer tous ces Url et de le faire de la recherche et de rendre ensuite un modèle approprié (vous ne pouvez pas rediriger, parce que ce serait changer l'url). Et c'est une vilaine façon de résoudre ce problème.Si j'étais vous, je serais tenter de convaincre le client de s'entendre sur une sorte de préfixe (comme
/p_pagename
) ou, de préférence, des Url différentes. Il pourrait être quelque chose comme/p/shipping
pour les pages et tous les autres Url pourraient être acheminés àCategoriesController
ouProductsController
.