当前位置:  开发笔记 > 程序员 > 正文

如何RESTful更新has_and_belongs_to_many集合?

如何解决《如何RESTful更新has_and_belongs_to_many集合?》经验,为你挑选了1个好方法。

我有两个脚手架生成的模型,学生班级.它们与has_and_belongs_to_many实现了多对多关系.
我希望能够改变其班级上课一个学生是和其学生 s的服用,每次.也就是说,我想修改学生变量(添加和删除项目),反之亦然.
我如何RESTful地执行此操作?
如果我删除一个学生班级名单,然后好像我要打电话更新我的students_controller.如果是这种情况,那么我应该作为参数传入什么来修改classes变量?另一个 es的集合(删除了适当的)?
我的另一个想法就是在students_controller中调用一些动作(比如remove_class)并传入要删除的的ID .这似乎很敏感,但不是RESTful.

最好的方法是什么?



1> austinfrombo..:

解决此问题的关键是正确识别要修改的资源.在这种情况下,您正在修改的资源是类和学生之间的关系,我将其称为Enrollment.

Rails中习惯于has_many :through优先使用has_and_belongs_to_many.您可能希望更改域逻辑以适应自定义,但如果您确实不需要存储关于关系的元数据,您也可以逆转趋势.

REST的一个关键思想是RESTful资源不需要映射到模型.你应该创建一个EnrollmentsController并添加一行到config/routes.rb:

map.resources :enrollments

然后您可以创建和删除您的关系,如下所示:

class EnrollmentsController < ApplicationController
    def create
       @student = Student.find(params[:student_id])
       @course = Course.find(params[:course_id])
       @student.courses << @course
       if @student.save
         #do happy path stuff
       else
         #show errors
       end
    end

    def destroy
       @student = Student.find(params[:student_id])
       @course = @student.courses.find(params[:course_id])
       @student.courses.delete( @course )
    end
end

你可以为这些动作制作按钮:

<%= button_to "Enroll", enrollments_path(:student_id => current_student.id, :course_id => @course.id ), :method => :post %>
<%= button_to "Withdraw", enrollment_path(1, :student_id => current_student.id, :course_id => @course.id ), :method => :delete %>

1以上用作占位符,其中行:enrollment_id应该是语法醋的一点点提醒你,你是逆势Rails框架的意愿.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有