29 votes

Pourquoi dois-je travailler plus fort pour que mon application Rails s'intègre dans une architecture RESTful?

L'Arrière-Plan

J'ai commencé un Rails de projet récemment et a décidé d'utiliser Reposant contrôleurs. J'ai créé des contrôleurs pour ma clé entités (Pays) et ajoutées à l'index, de nouveau, éditer, créer, afficher, mettre à jour, supprimer. J'ai ajouté ma carte.ressources :pays de mon fichier de routes et la vie était bonne.

Après développement a progressé un peu, j'ai commencé à rencontrer des problèmes... j'ai parfois besoin supplémentaire des actions dans mon contrôleur. Il y eut d'abord la recherche action qui a renvoyé les options pour ma fantaisie autocompleting zone de recherche. Puis est venu le besoin d'afficher le pays de deux manières différentes dans différents endroits de l'application (les données affichées était différente, de sorte qu'il n'était pas juste deux points de vue) - j'ai ajouté la index_full action. Ensuite, j'ai voulu montrer un pays par son nom dans l'URL, pas par id j'ai donc ajouté le show_by_name action.

La Question

Que faites-vous quand vous avez besoin d'actions au-delà de l'indice standard, nouvelles, éditer, créer, afficher, mettre à jour, supprimer dans un cadre Reposant contrôleur dans les Rails? Ai-je besoin d'ajouter (et de maintenir) manuel de routes dans les itinéraires.rb fichier (ce qui est une douleur), vont-ils dans une autre manette, puis-je devenir parsèments ou ai-je raté quelque chose de fondamental?

Précisions

Je suppose que je me demande, ai-je besoin de travailler plus dur et ajouter des actions dans mon parcours.rb fichier pour le privilège d'être Reposante? Si je n'étais pas à l'aide de la carte.les ressources à ajouter le RESTE des goodies, la norme :controller/:action, :controller/:action/:id routes serait en mesure de gérer à peu près tout automatiquement.

13voto

Dave Nolan Points 2280

Je voudrais traiter de recherche comme un cas particulier de l'index. Les deux actions de retour d'une collection de ressources. Les paramètres de la requête doit préciser les choses comme page, à la limite, l'ordre de tri et de recherche de la requête.

Par exemple:

/resources/index # normal index
/resources/index?query=foo # search for 'foo'

Et dans resources_controller:

before_filter :do_some_preprocessing_on_parameters

def index
  @resources = Resource.find_by_param(@preprocessed_params)
end

Comme pour index_full et search_by_name, vous pouvez consulter la division de votre contrôleur actuel en deux. Il y a une odeur à propos de ce que vous avez décrit...

Cela dit, vous avez tout à fait raison de dire qu'il ne sert à rien de forcer votre application à l'utilisateur reposant routes lorsqu'il ne livre rien de plus /:controller/:action/:id. Pour prendre la décision, regardez à quelle fréquence vous utilisez le repos des ressources itinéraire aides dans les formulaires et les liens. Si vous ne les utilisez pas, je n'aurais pas pris la peine avec elle.

8voto

Codebeef Points 17084

Si je dépasse les actions CRUD standard avec mes modèles, j'ajoute normalement les méthodes selon les besoins. La recherche est quelque chose que j'ajoute à de nombreux contrôleurs, mais pas à tous, donc je l'ajoute et je maintiens les routes normalement:

 map.resources :events, :collection => { :search => :get }
 

Déplacer ces actions vers un contrôleur entièrement séparé peut garder certains de vos contrôleurs RESTful, mais je trouve que les garder en contexte est beaucoup plus utile.

5voto

Godeke Points 10401

RESTE n'a pas d'indiquer que vous ne pouvez pas avoir d'autres points de vue. Aucune application réelle va être en mesure d'utiliser uniquement l'adaptateur actions; c'est pourquoi vous pouvez ajouter vos propres actions.

Le REPOS est être capable de les rendre apatrides des appels vers le serveur. Votre recherche action est apatride, à chaque fois que les données à ce jour est fournie, correct? Votre affichage alternatif de l'action est également sans état, juste un point de vue différent.

Quant à savoir si elles devraient être manuel d'itinéraires ou d'un nouveau contrôleur, qui dépend de l'distincts de l'activité. Une autre vue, si elle fournit un ensemble complet d'opérations CRUD (create, read, update, delete) les opérations feraient bien d'être dans un nouveau contrôleur. Si vous avez seulement une autre vue pour les données, je voudrais simplement ajouter une autre vue de l'action.

En d'autres termes, il ne ressemble pas à votre demande est de ne pas être Reposant, il est plus un problème de conscience que le générés automatiquement ensemble des fonctionnalités est un point de départ, pas une conclusion.

0voto

Jeremy Points 884

À mon avis, ils ont peut-être un peu déraillé ici. Qu'est-il arrivé à DRY?

Je reviens juste à Rails sans l'avoir beaucoup développé depuis la bêta et j'attends toujours que l'ampoule s'allume ici. Je lui donne toujours une chance mais si cela ne m'est pas arrivé à la fin de mon projet actuel, je vais probablement revenir aux anciennes routes standard et définir les méthodes car j'en ai réellement besoin pour la suivante .

0voto

Omar Qureshi Points 5755

L'habitude de passer à l'expliquer plus sur le RESTE car je pense que cela a été répondu à mort dans cette question, cependant je vais vous parler un peu de la route par défaut.

Mon principal problème avec la route par défaut, c'est que si vous avez plusieurs sites à l'aide de la même application rails, il peut paraître horrible.

Par exemple il peut y avoir des contrôleurs que vous ne voulez pas les gens à être en mesure de voir sur une seule application:

par exemple

http://example1.somesite.com/example_2/foo/bar/1

comparez cela à

/:controller/:action/:id

Ce serait aller à l'automate example_2/foo, barre d'action et l'id 1

Je considère que c'est le principal défaut de les rails de la route par défaut et c'est quelque chose que le Réparateur de routes (avec sous-domaine extensions) ou que le nom des routes (la carte.connect 'foo' ... ) peut fixer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X