2011-11-09 46 views
0

我有在多個類別的職位一個博客。我想給每個類別一個單獨的登陸頁面,列出該類別中的所有沼氣帖子。Rails的路由/控制器 - 上市集的子集

什麼是產生這些着陸頁的路線和控制器動作的適當方法?它會違反REST的精神,在我的帖子控制器中創建多個索引式操作(每個類別一個操作)?如果是這樣,我該怎麼做呢?

例如,我的博客可能有兩類,「音樂」和「電影」。

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

不知道這是否是最理想的,但我一般都會讀到應該堅持單一控制器中的寧靜行爲。所以你可以在名爲posts的控制器中創建一個文件夾,並將音樂和電影控制器放在那裏。添加索引操作,並設置路由以指向它。然後將相應的主動記錄查詢放入動作中以獲取電影/音樂帖子。 – agmcleod

回答

0

我不知道這是完全在REST的精神(我不完全瞭解它尚未),所以我會離開的問題別人的那一部分。由於collection方法存在to extend RESTful routes,我假定只要您不濫用它,它就被允許。 我不認爲,雖然,有沒有路線「/職位/」前綴是一件好事,因爲它會誘發例如在「/音樂/」路徑涉及到一個完全不同的資源。

你可以做這樣的事情:

(在routes.rb中)

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

...然後添加索引樣作用到控制器,如:

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

如果你有一個有限的常量集類的,這可以DRYed了這種方式:

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