2011-11-09 6 views
0

私は複数のカテゴリの投稿を含むブログを持っています。各カテゴリに、そのカテゴリのすべてのボグ投稿をリストする個別のランディングページを与えたいと思います。Railsルーティング/コントローラ - コレクションのサブセットのリスト

これらのリンク先ページごとにルートとコントローラのアクションを生成するには、どのような方法が適していますか?複数の索引エスクのアクション(カテゴリごとに1つのアクション)を投稿コントローラに作成するには、RESTの精神に違反しますか?もしそうなら、どうすればいいですか?

たとえば、私のブログには「音楽」と「映画」という2つのカテゴリがあります。

GET /posts/ # would list all posts. 

GET /music/ # would list all posts in the "Music" category. 

GET /movies/ # would list all posts in the "Movies" category. 

謝罪この質問は明白な答えを持っている場合、または私は完全に間違った質問をしています。私はRailsとRESTの両方が新しく、アプリケーションを構造化する最良の方法を理解しようとしています。

+0

これが最も理想的なのかどうかはわかりませんが、私は一般的に、1つのコントローラで安心して行動するべきだと読んでいます。だからあなたは、ポストと呼ばれるコントローラー内にフォルダーを作成し、そこにミュージック&ムービーコントローラーを置くことができます。インデックスアクションを追加し、それを指すようにルートを設定します。次に、ムービー/ミュージックポストを取得するためのアクションに適切なアクティブレコードを配置します。 – agmcleod

答えて

0

私はそれが完全にRESTの精神であるとは確信していません(私はそれをまだ完全に理解していません)ので、私はその質問の部分を他の人に任せます。 collectionメソッドがあるのでto extend RESTful routes、私はあなたがそれを悪用しない限り許可されると仮定します。 "/ posts /"という接頭辞が付いていないルートは良いことだと思います。たとえば、 "/ music /"パスが完全に別のリソースに関連することを誘発するからです。

あなたはこのような何か行うことができます。

(routes.rbを中)

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

を...そして、あなたのコントローラにインデックスのようなアクションを追加し、例えば:

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

カテゴリが限定されたものであれば、これは次のようにDRYできます。

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 
関連する問題