Rails路由/控制器——列出集合的子集



我有一个博客,上面有多个类别的文章。我想给每个类别一个单独的登陆页,列出所有的博客帖子在该类别。

为每个着陆页生成路由和控制器动作的合适方法是什么?在我的post控制器中创建多个索引式操作(每个类别一个操作)是否违反REST的精神?如果是这样,我还应该怎么做呢?

例如,我的博客可能有两个类别,"音乐"one_answers"电影"。

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的新手,我正在尝试理解构建应用程序的最佳方法。

我不确定它是否完全符合REST精神(我还没有完全理解它),所以我将把这部分问题留给其他人。由于collection方法的存在是为了扩展RESTful路由,我认为只要您不滥用它,它是允许的。但是,我不认为没有"/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

如果你有一个有限且恒定的类别集,可以这样做:

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

最新更新