在rails上的ruby中的嵌套模型路由

时间:2012-06-28 15:03:22

标签: ruby-on-rails ruby

在我的应用程序中,我有一个用户模型,学校模型,课程模型和教学大纲模型。用户或学校可以创建我通过多态关联(课程belongs_to:hostable,school / user has_many:courses,as :: hostable)设置的课程,以及课程has_one教学大纲。我的问题是如何配置嵌套课程模型的路线,该模型也有嵌入其中的教学大纲模型。

resources :users do
  resources :courses do
   resources :syllabus
  end 
    member do
    put :enroll
   end
  end

 resources :schools do
  resources :courses do 
   resources :syllabuses
  end
   member do
  put :apply, :enroll
  end
end

因此,用户可以通过单击课程页面上的按钮,在我的课程控制器中注册课程:

def enroll
  @course = Course.find(params[:id])
  current_user.coursegroups.create(host_course_id: @course.id, role: 'applicant')
  respond_with @course
end

那么,这是配置路线的正确方法吗?

1 个答案:

答案 0 :(得分:1)

Stefan说你应该小心将资源嵌套到一个以上的深度,但我个人认为嵌套在两个级别之前无法管理。无论哪种方式,这只是个人偏好。

对于你的路线,立即跳出来的一件事就是将所有内容嵌套在用户和学校内部是没有必要的,因为它听起来像你将以用户或学校的身份登录。其中包含登录用户的路由非常难以管理:用户无法共享它们,并且它们并不真正反映指定资源的状态。例如:

/users/1/courses/14/syllabus/3

理论上,courses/14/syllabus/3应该对每个登录用户都一样,但是任何尝试共享此链接的人都需要首先包含他们自己的用户ID号,这有点傻。而是像这样构建你的路线:

resource :sessions
resources :courses do
  resources :syllabus
  member do
    put :apply, :enroll
  end
end

在您的会话中,允许用户或学校登录,并根据使用CanCan之类的内容登录,改变他们在视图中看到的内容(以及他们允许访问的资源)。现在,您的路线将正确反映实际资源(/courses/14/syllabus/3)。