2011-10-10 145 views
0

我对如何设置RESTful rails应用程序感到困惑。我有一些模型 - 课程,学生,作业和StudentHandsInAssignment。在课程和学生之间存在多对多的关系,在课程和作业之间是多对多的关系,以及两对一对多的学生和作业到StudentHandsInAssignment。Rails和REST混淆

现在我正在考虑控制器和路由。从我读过的东西中,我想要成为RESTful,这意味着要制作资源。然而,我不能完全弄清楚如何在rails提供的资源中获得所有我想要的东西。

特别是,我想详细了解课程中学生的所有成绩。现在,我是否可以在控制器中使用简单的“GET/courses /:id”路由和相应的方法,或者使用更类似“GET/courses /:id/view_complete_grade_summary”的内容。我想我想做一些类似于后者的事情,因为我可能有多种不同的方式查看课程。人们如何处理这种情况并设置路线/控制器?

此外,我需要有一个表格才能在应用中输入成绩。这将创建StudentHandsInAssignment对象并将它们存储在数据库中。但是,当我使用“GET student_hands_in_assignments/new”来显示表单(并最终提交以调用“create”)时,我如何传递学生ID和作业ID?它应该是这样的:

“GET student_hands_in_assignments /新/:student_id数据/:assignment_id”

或像这样:

“?GET student_hands_in_assignments /新/ student_id数据= 1 & assignment_id = 2”

我想我很困惑如何获得关于学生和分配到一个RESTful URL所需的信息。处理这些情况的最佳方法是什么?

+1

StudentHandsInAssignment?如何...等级? –

+0

哈哈...是的,这可能是一个更好的名字。 –

回答

1

没有一个“正确”的方式来组织资源,海事组织。我的第一个想法是以学生为中心:student /:student_id/course /:course_id/grade,但它可以很容易以课程为中心,或两者兼而有之。

虽然我没有单独的页面来输入成绩,但是有些东西挂在学生页面上(页面上以Ajax为中心的入门课程列表)关闭课程页面(列表的同一年级入学计划的学生)。否则,应用程序转换只会增加认知开销而没有任何好处。

对于像课程成绩总结这样的内容,我只需要/ course /:course_id/grade_summary或​​任何必需的东西。

0

尽管我发现创建漂亮的URL有助于我组织资源,但在维护我的代码的同时仍然保持其理智,对于REST风格的应用程序使用'漂亮'的URL不是必需的。

我会考虑使用该网址与你所描述的情景:

# Renders the form to be submitted 
/students/:student_id/assignments/:assignment_id 

添加类似以下内容到你的路线。RB:

resources :students do 
    resources :assignments 
end 

它将调用:

{controller => 'assignments', :action => 'show'} 

与参数:

{id => ':assignment_id', student_id => ':student_id'} 

作为一个侧面说明,考虑改变你的模型 'StudentHandsInAssignment' 的名义到别的东西。交付作业的学生既不是模型也不是控制器,它是对资源的操作。让AssignmentController具有更新Assignment模型的动作“hand_in”可能更有意义(推测是使用状态)。

希望这会有所帮助。

+0

StudentHandsInAssignment是我的应用程序中的一个模型。它加入了一个学生和一个作业。作业包含名称,说明,截止日期。 StudentHandsInAssignment为一个作业记录一个学生的成绩。我的问题之一是如何处理这些连接模型的路由/控制器? –

+0

@MarkM模型几乎总是一个名词,而不是一个动词。动词词组?作为一个模型,国际海事组织,这个名称是没有任何意义的,处理任务是一项引用资源的行动。交付任务实际上是一个学生在给定课程中的任务的状态转换。等级是分配属性或单独的模型,只能应用于处于交付/提交状态的分配。 –