何时在ActionController :: Parameters中使用slice vs. permit?

时间:2016-08-24 16:28:57

标签: ruby-on-rails

假设我有一个ActionController::Parameters对象,如

params = ActionController::Parameters.new(a: 1, b: 2, c: 3)

我可以在其上调用slicepermit来获取/仅允许某些参数。

乍一看,他们回归同样的事情

> params.slice(:a)
=> {"a"=>1}

> params.permit(:a)
[18:21:45.302147] Unpermitted parameters: b, c
=> {"a"=>1}

但是如果我在其上调用to_h params.slice(:a).to_h则返回空哈希,而params.permit(:a).to_h则返回键:a的哈希值。据我所知,情况确实如此,因为:a是不允许的。

我现在想知道的是,slice的用例是什么,如果我可以使用permit

2 个答案:

答案 0 :(得分:5)

我可以想到的一个区别是permit如果你没有明确指定嵌套键而slice允许嵌套哈希,那么会削减嵌套哈希:

# params = { a: 'a', nested: { nested_1: 1, nested_2: 2 } }
params.permit(:a, :nested) # => { a: 'a' }
params.slice(:a, :nested) # => { a: 'a', { nested_1: 1, nested_2: 2 } }

另一个区别在于Rails 4,permitActiveModel::ForbiddenAttributes (answered here)中呼叫时不会提升.update_attributes(...)

user.update_attributes(params.slice(:email)) # will raise ActiveModel::ForbiddenAttributes
user.update_attributes(params.permit(:email)) # wont raise error

答案 1 :(得分:0)

slice可以使用选定的键对哈希进行切片。

其中.permit返回一个新的ActionController :: Parameters实例,该实例仅包含给定的过滤器,并将该对象的allowed属性设置为true。这对于限制应该允许哪些属性进行批量更新非常有用。

我会说切片是针对处理Hash的所有内容而且是using slice pattern创建的,但更多是在url params的上下文中。

希望它有所帮助!

另请阅读:http://apidock.com/rails/ActionController/Parameters/permit