0

我需要的是路由

resources :posts

但是考虑到每个帖子对象都有不同的类别(类别是数据库中的一列,而不是引用的对象!),类别保存在Page::CATEGORIES. 底线,我需要例如'www.example.com/posts/admin_posts'路由到post/index action,但有参数'admin_posts',所以我可以在范围内使用它。我希望我说清楚了:) 我不想再采取任何行动,也绝对不想单独定义每条路线,它们都应该来自Page::CATEGORIES。知道怎么做吗?

编辑

我正在编辑这个问题,因为它不是很清楚

有一个模型Post,列类别和所有类别都存储在 中Post::CATEGORIES,我的目标是为每个类别提供路线,但是,每条路线都将其纳入相同的旧索引操作。

def index
    @posts = Post.by_category(category)
end

现在,此处的 category 是范围的一个参数,它允许我只获取路由中指定的那些帖子。例如,posts/stupid_posts 会生成category = "stupid_posts",并且@posts只会生成愚蠢的_posts。真的希望现在更好

4

3 回答 3

2

您可以制作这样的路线:

get '/posts/:category', to: 'posts#index',
  constraints: { category: Regexp.new(Post::CATEGORIES.join('|')) }

然后index您可以通过以下方式获取类别params[:category]

def index
  @posts = Post.by_category(params[:category])
end
于 2013-08-29T14:24:03.703 回答
0

我要在这个问题上打个赌。但我强烈建议您查看rails routing 部分

由于您在 constant 中有类别Page::CATEGORIES,因此您可以为此编写一个帮助程序。为简洁起见,这是一种快速而肮脏的方法:

- Page::CATEGORIES.each do |cat|
  = link_to cat, posts_path(category: cat)

遍历页面类别并将它们提供给 params 哈希。然后,在查找帖子的控制器方法中,您将可以访问params[:category]. 用它来查询相关的帖子。

于 2013-08-29T14:19:49.350 回答
0

我实际上会反过来做。从层次结构的角度来看,帖子属于类别,而不是类别属于帖子(无论您在数据库中如何建模),所以我会使用以下路线:

scope ":category" do
  resources :posts, as: :category_posts
end

这将路由到posts控制器,并且params[:category]在每个请求中都可用。

在控制器内部,我会检查 params[:category] ​​是否真的存在,如果不存在则返回 404。

于 2013-08-29T14:38:58.960 回答