【问题标题】:Any difference between :model and :model_id in attr_accessible for Rails/ActiveRecord?Rails/ActiveRecord 的 attr_accessible 中的 :model 和 :model_id 有什么区别?
【发布时间】:2012-09-24 08:40:29
【问题描述】:

当我创建一个脚手架并且我需要与另一个模型建立 belongs_to 关系时,我添加了一个名为 model_id 的字段(将模型替换为该模型的名称):

rails generate scaffold Grade user_id:integer subject_id:integer letter:string

那么在上面的Grade模型中,我可能会添加:

belongs_to :user
belongs_to :subject

Rails 自动将user_idsubject_id 添加到attr_accessible 字段列表中。将:user:subject 添加到attr_accessible 字段列表中,这样我也可以使用它们进行批量分配,这样做有什么害处吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2 scaffolding


    【解决方案1】:

    attr_accessible 旨在防止来自外部发送到您的应用程序的数据的批量分配攻击。在大多数情况下,您可能会在创建和更新操作中执行以下操作:

    @model = Model.new(params[:model])
    or
    @model.update_attributes(params[:model])
    

    您应该问自己为什么会有一个使用 subject_id 的表单和另一个使用 subject 的表单。这里唯一真正的危害是不一致,这实际上对大型项目非常不利。如果您遵循所有表单都将使用实际数据库列 (subject_id) 的约定,那么当您不记得为什么以两种不同的方式使用它时,您将来会省去一些麻烦。

    如果您通过控制台更新属性,您可以使用update_attributes(params[:model], without_protection: true) 或我编写的名为sudo_attributes 的gem,它可以让您执行sudo_update_attributes(params[:model])

    【讨论】:

      【解决方案2】:

      我认为它不会伤害你,但会给你的代码带来一种混乱

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-08
        • 2021-07-27
        • 1970-01-01
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多