Rails和REST混淆

时间:2011-10-10 00:34:14

标签: ruby-on-rails rest

我对如何设置RESTful rails应用感到困惑。我有一些模型 - 课程,学生,作业和StudentHandsInAssignment。课程与学生之间存在多对多的关系,课程与作业之间存在多对多的关系,学生与作业中的两对一与学生手中的分配。

现在我正在考虑控制器和路由。从我所读到的,我想成为RESTful,这意味着创造资源。但是,我无法弄清楚如何在rails提供的资源中获得我想要的所有东西。

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

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

“GET student_hands_in_assignments / new /:student_id /:assignment_id”

或者像这样:

“GET student_hands_in_assignments / new /?student_id = 1& assignment_id = 2”

我想我很困惑如何获得有关学生和分配到RESTful网址的必要信息。处理这些情况的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

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

我不会有单独的页面来输入成绩,而是挂在学生页面上的东西(具有页内,以Ajax为中心的成绩条目的注册课程列表) off a off a off课程页面(具有相同年级入学计划的学生名单)。否则会有app转换只会增加认知开销而没有任何好处。

对于类似课程成绩摘要的内容,我只需要/ course /:course_id / grade_summary或​​其他任何必要的内容。

答案 1 :(得分:0)

RESTful应用程序不需要使用“漂亮”的URL,但我发现创建漂亮的URL可以帮助我整理资源,帮助其他人在维护代码的同时保持理智。

我会考虑将此网址与您描述的方案一起使用:

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

在routes.rb中添加以下内容:

resources :students do
  resources :assignments
end

将调用:

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

参数:

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

作为旁注,请考虑将模型“StudentHandsInAssignment”的名称更改为其他名称。交付作业的学生既不是模特也不是财务主任,而是对资源的行动。让AssignmentController具有更新Assignment模型的动作“hand_in”(可能具有状态)可能更有意义。

希望这有帮助。