【问题标题】:Rails routing/controllers - listing subsets of collectionsRails 路由/控制器 - 列出集合的子集
【发布时间】:2011-12-25 18:43:00
【问题描述】:

我有一个博客,其中包含多个类别的帖子。我想为每个类别提供一个单独的登录页面,其中列出了该类别中的所有沼泽帖子。

为每个登录页面生成路由和控制器操作的适当方法是什么?在我的帖子控制器中创建多个索引式操作(每个类别一个操作)会违反 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 的新手,我正在尝试了解构建应用程序的最佳方式。

【问题讨论】:

  • 不确定这是否是最理想的,但我通常读到应该坚持在单个控制器中进行安静的操作。因此,您可以在控制器中创建一个名为 posts 的文件夹,并将音乐和电影控制器放入其中。添加索引操作,并设置指向它的路由。然后将适当的 activerecord 查询放入操作中以获取电影/音乐帖子。

标签: ruby-on-rails rest routes controllers


【解决方案1】:

我不确定它是否完全符合 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

如果您有一组有限且固定的类别,则可以这样干掉:

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

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多