2011-11-09 1 views
0

J'ai un blog avec des messages dans plusieurs catégories. J'aimerais donner à chaque catégorie une page d'atterrissage qui répertorie tous les poteaux de cette catégorie.Rails routage/contrôleurs - énumérant des sous-ensembles de collections

Quelle est la méthode appropriée pour générer les routes et les actions de contrôleur pour chacune de ces pages de destination? Serait-ce contraire à l'esprit de REST de créer plusieurs actions index-esque (une action par catégorie) dans mon contrôleur posts? Si oui, comment pourrais-je le faire autrement? Par exemple, mon blog peut comporter deux catégories, "Musique" et "Films". Excuses si cette question a une réponse évidente, ou si je pose la mauvaise question entièrement. Je suis nouveau à la fois Rails et REST et j'essaie de comprendre la meilleure façon de structurer les applications.

+0

Je ne sais pas si c'est le plus idéal, mais j'ai généralement lu que l'on devrait s'en tenir aux actions reposantes dans un seul contrôleur. Donc, vous pouvez créer un dossier dans les contrôleurs appelés postes, et mettre de la musique, et les contrôleurs de films là-bas. Ajoutez les actions d'index et configurez les itinéraires pour qu'ils pointent vers cela. Ensuite, placez les requêtes appropriées d'enregistrement dans les actions pour obtenir simplement les films/posts musicaux. – agmcleod

Répondre

0

Je ne suis pas sûr que ce soit totalement dans l'esprit REST (je ne comprends pas encore), donc je vais laisser cette partie de la question à quelqu'un d'autre. Comme la méthode collection existe to extend RESTful routes, je suppose que c'est permis tant que vous n'en abusez pas. Je ne pense pas, cependant, qu'avoir des routes sans préfixe "/ posts /" soit une bonne chose, car cela induirait que le chemin "/ music /" se rapporte par exemple à une ressource complètement différente.

vous pouvez faire quelque chose comme ceci:

(en routes.rb)

resources :posts do 
    collection do 
    get 'music' 
    get 'movies' 
    end 
end 

... puis ajouter des actions indicielles à votre contrôleur, par exemple:

def music 
    @posts = Post.where(category: 'music') 
    render :index 
end 

si vous avez un ensemble limité et constant de catégories, cela peut être séché de cette façon:

class Post < ActiveRecord::Base 
    CATEGORIES = [:music,:movies,:art,:jokes,:friends,:whatever].freeze 
end 

class PostsController < ApplicationController 
    Post::CATEGORIES.each do |category| 
    eval <<-INDEX_LIKE_ACTIONS 
     def #{category} 
     @posts = Post.where(category: '#{category}') 
     render :index 
     end 
    INDEX_LIKE_ACTIONS 
    end 
end 

resources :posts do 
    collection do 
    Post::CATEGORIES.each {|category| get category.to_s} 
    end 
end 
Questions connexes