不同的URL使用相同的操作

时间:2013-08-29 13:58:23

标签: ruby-on-rails

我需要的是路由

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

现在,这里的类别是范围的参数,这将允许我只获取路径中指定的那些帖子。例如posts / stupid_posts会使category = "stupid_posts"@posts只有stupid_posts。 真的希望它现在更好

3 个答案:

答案 0 :(得分:1)

你可以这样做一条路线:

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

答案 1 :(得分:0)

我打算在这个问题上采取行动。但我强烈建议您查看rails routing section

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

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

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

答案 2 :(得分:0)

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

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

这将路由到posts控制器,每个请求都会params[:category]

在控制器内部,我会检查params [:category]是否确实存在,如果不存在则返回404.