我怎么能禁止手动更新特定对象属性?

时间:2013-07-09 04:14:06

标签: ruby-on-rails

我的班级有一个secret列,我使用特定的流程生成。因此,我不想让用户通过编辑表单更新此字段 但是,如果用户手动将secret标记添加到表单并提交,我的对象secret也会更新。

def update
  object.attributes = params[:my_class]
end

我想我创建了一个像这样的前过滤器

before_filter :clear_secret, :only => :update
def clear_secret
  params.delete(:secret)
end

我想知道是否有更好的方法来做到这一点。我可以从模特那里做到吗?是否已存在Rails方法?

2 个答案:

答案 0 :(得分:2)

使用strong_parameters gem来执行此操作是常规的。

使用所述gem,您只能允许可以更新的属性,如下所示:

params.permit(:some_attr, :another_attr)

答案 1 :(得分:2)

如果您使用的是Rails 3,则可以通过attr_protected

保护此功能
class YourModel < ActiveRecord::Base
  attr_protected :secret
end

尝试在表单中插入secret字段的用户将导致Rails引发ActiveModel::MassAssignmentSecurity::Error

但是,在Rails 4中不推荐使用这种机制,而是赞成@gylaz引用的strong_parameters机制。