我有一个博客,上面有多个类别的文章。我想给每个类别一个单独的登陆页,列出所有的博客帖子在该类别。
为每个着陆页生成路由和控制器动作的合适方法是什么?在我的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