在Rails控制器中,有没有办法过滤params散列,以便它只包含列入白名单的属性?

时间:2013-07-08 15:15:55

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

在控制器的更新操作中,我有:

entry.update_attributes(params[:entry])

params[:entry]中有一些键对应于不可访问的字段,或根本没有字段。如果我无法控制params[:entry]中的值,我该如何过滤它,以便只有相关模型的可访问字段保留在其中,可能是通过访问模型的列入白名单的属性列表?我知道如何从哈希中排除/包含密钥,但我不想手动定义要包含/排除的密钥,因为当模型已在模型中定义时,我将复制白名单。

我正在使用Rails 3.2.13。

3 个答案:

答案 0 :(得分:2)

http://apidock.com/rails/Hash/except

除了(*键)public

返回包含除给定键之外的所有内容的哈希。这对于将一组参数限制为除少数已知切换之外的所有参数非常有用:

@person.update_attributes(params[:person].except(:admin))

答案 1 :(得分:1)

它在Rails 4中的默认值,所以你应该使用它:)

它也适用于Rails 3:https://github.com/rails/strong_parameters

答案 2 :(得分:1)

对于那些希望过滤哈希问题的答案的人来说,它只有一组选定的键,使用哈希的rails slice方法和模型的可访问属性一起工作。

@person.update_attributes(params[:person].only(*Person.attr_accessible[:default]‌​.to_a))

我认为这可能是一种更简洁的方法,欢迎提出建议。