【问题标题】:In Rails, how can I protect an attribute from mass assignment while still allowing the attribute to be set when the object is first created?在 Rails 中,如何在第一次创建对象时允许设置属性的同时防止属性被大量赋值?
【发布时间】:2012-07-12 13:46:24
【问题描述】:

我现在才使用 Rails 几个月,所以我可能遗漏了一些明显的东西,但是如果一个属性受到 attr_accessibleattr_protected 的大规模分配保护,你如何设置该属性你先创纪录? (并且以仍然安全的方式进行。)


例如:

假设我正在开发一个应用程序,用于跟踪公司员工接受过培训的不同程序和流程。

作为此应用程序的一部分,我有三个模型:UserCourseTrainingClassUser 代表员工,Course 代表可以培训员工的不同内容,TrainingClass 代表将在其中培训员工的特定课程。

TrainingClassCourse 模型(因为课程基本上只是课程的特定实例)和 User 模型(因为课程只有一个讲师,他是创建TrainingClass) 的用户。同样,CourseUser 模型都与TrainingClass 模型具有has_many 关系。

根据这些信息,我将如何为TrainingClass 创建新记录?

我可以说:

course.training_classes.build(user_id: user.id)

user.training_classes.build(course_id: course.id)

但这不是对user_idcourse_id 属性的批量分配吗?

在保持应用程序安全的同时做到这一点的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mass-assignment


    【解决方案1】:

    了解Mass Assignment Security,特别是角色

    你可以有

    class TraningClass < ActiveRecord::Base
      attr_accessible .....
      attr_accessible ....., :user_id, as: :create
    end
    

    ...... 是您希望访问以进行批量分配的其他属性的列表。然后当你调用build 时,你将传递该角色

    course.training_classes.build({user_id: user.id}, as: :create)
    

    对您的其他模型重复类似的操作。除非您在调用buildcreate! 等时指定:create 角色,否则将使用默认角色(第一个)...

    【讨论】:

    • 谢谢,这正是我想要的。不过,一件小事;在您的示例中,user_id: user.id 需要用大括号 {} 括起来,否则 Rails 会将 as 解释为要分配给 TrainingClass 的另一个参数。 (我会自己进行更正,但显然 StackOverflow 不允许我进行少于 6 个字符的编辑?这是怎么回事?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多