【发布时间】:2026-02-07 06:25:01
【问题描述】:
我有一个 CourseCategory 模型和一个 Course 模型以及相应的控制器 course_categories 和 course。一个课程属于一个类别,一个类别有很多课程。
我想要一个显示特定类别课程的页面。这个功能属于哪个控制器?我应该嵌套这些资源吗?只是在寻找最好的建模方法。
【问题讨论】:
标签: ruby-on-rails
我有一个 CourseCategory 模型和一个 Course 模型以及相应的控制器 course_categories 和 course。一个课程属于一个类别,一个类别有很多课程。
我想要一个显示特定类别课程的页面。这个功能属于哪个控制器?我应该嵌套这些资源吗?只是在寻找最好的建模方法。
【问题讨论】:
标签: ruby-on-rails
课程类别。想想你的网址,这是做出这样决定的最简单方法:
example.com/course_categories/1
--或者,更好的是,对类别使用 slugs 而不是 ids,你会得到--
example.com/course_categories/awesome_courses/
但是,考虑简单地使用“categories”模型而不是“course_categories”模型可能是值得的。然后你可以在课程下嵌套类别,你会得到类似的东西:
example.com/courses/categories/1 或 example.com/courses/categories/hard
【讨论】:
我会说您将显示课程类别列表 - 因此属于课程类别控制器。
【讨论】:
您可以添加它,以便课程控制器并采用参数说明要响应的类别。
或者,如果有意义,您可以将课程设置为 course_categories 的嵌套属性。那么这将是默认行为。
编辑 因为我给出了别人相反的答案。第一个建议会让你
/courses?course_category=math
或
/courses/math
然后在控制器中查找 course_category
第二个想法会让你这样做
/math/courses
【讨论】:
另一种方法是做类似的事情
routes.rb
resources :course_catgeories do
resources :courses
end
courses_controller.rb
def index
@course_category = CourseCategory.find(params[:course_category_id])
@courses = @course_category.courses
end
这里的逻辑是,如果您要列出某个类别的课程,那么该类别的常规操作就是索引操作。除了在这种情况下,您将列表范围限定为特定类别。因此,如果您从这些方面考虑,我认为这种方法可以更好地模拟您的域。
这种方法有效地产生了以下路线:
/course_categories/(类别索引页)
/course_categories/1(类别显示页面)
/course_categories/1/courses(课程索引页)
/course_categories/1/courses/1(课程展示页面)
【讨论】: