【问题标题】:Ruby On Rails Model/Controller QuestionRuby On Rails 模型/控制器问题
【发布时间】:2026-02-07 06:25:01
【问题描述】:

我有一个 CourseCategory 模型和一个 Course 模型以及相应的控制器 course_categories 和 course。一个课程属于一个类别,一个类别有很多课程。

我想要一个显示特定类别课程的页面。这个功能属于哪个控制器?我应该嵌套这些资源吗?只是在寻找最好的建模方法。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    课程类别。想想你的网址,这是做出这样决定的最简单方法:

    example.com/course_categories/1

    --或者,更好的是,对类别使用 slugs 而不是 ids,你会得到--

    example.com/course_categories/awesome_courses/

    但是,考虑简单地使用“categories”模型而不是“course_categories”模型可能是值得的。然后你可以在课程下嵌套类别,你会得到类似的东西:

    example.com/courses/categories/1example.com/courses/categories/hard

    【讨论】:

      【解决方案2】:

      我会说您将显示课程类别列表 - 因此属于课程类别控制器。

      【讨论】:

        【解决方案3】:

        您可以添加它,以便课程控制器并采用参数说明要响应的类别。

        或者,如果有意义,您可以将课程设置为 course_categories 的嵌套属性。那么这将是默认行为。

        编辑 因为我给出了别人相反的答案。第一个建议会让你

        /courses?course_category=math
        

        /courses/math
        

        然后在控制器中查找 course_category

        第二个想法会让你这样做

        /math/courses
        

        【讨论】:

          【解决方案4】:

          另一种方法是做类似的事情

          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(课程展示页面)

          【讨论】: