假设我有一个ActionController::Parameters
对象,如
params = ActionController::Parameters.new(a: 1, b: 2, c: 3)
我可以在其上调用slice
或permit
来获取/仅允许某些参数。
> 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
?
答案 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,permit
在ActiveModel::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