【问题标题】:Nested model routes in ruby on rails appruby on rails 应用程序中的嵌套模型路由
【发布时间】:2012-06-30 03:23:27
【问题描述】:

在我的应用程序中,我有一个用户模型、学校模型、课程模型和教学大纲模型。用户或学校可以创建我通过多态关联设置的课程(课程 belongs_to :hostable 和学校/用户 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

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

【问题讨论】:

  • docs 中有一句话说:“资源的嵌套深度不应超过 1 级。”

标签: ruby-on-rails ruby


【解决方案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)。

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多