我需要的是路由
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。
真的希望它现在更好
答案 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.