2016-08-24 19 views
1

私は私が取得することにsliceまたはpermitを呼び出すことができますActionController :: Parametersでsliceとpermitを使用するのはいつですか?

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

ようActionController::Parametersオブジェクトを持っていると仮定すると/のみ特定のパラメータを許可します。一見

、彼らは同じこと

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

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

を返す。しかし、私はそれにto_hを呼び出す場合params.permit(:a).to_hはキー:aでハッシュを返しながら、空のハッシュを返しますparams.slice(:a).to_h。私が理解している限り、:aは許可されていないため、これが該当します。

permitを使用すれば、sliceのユースケースは何ですか?

答えて

0

sliceは、選択したキーでハッシュをスライスする機能を提供します。

ここで、.permitは、指定されたフィルタのみを含む新しいActionController :: Parametersインスタンスを返し、オブジェクトのallowed属性をtrueに設定します。これは、一括更新に許可されるべき属性を制限するのに便利です。

スライスはハッシュを扱うすべてのものであり、許可は​​ですが、url paramsのコンテキストではより多く作成されます。

希望すると助かります!

もこれを読んで:

# 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 } } 

もう1つの違いは次のとおりです。私は考えることができhttp://apidock.com/rails/ActionController/Parameters/permit

+0

'slice'もActionController :: Parametersのインスタンスを返します。また、そのクラスが強力なパラメータのために導入されたので、なぜHashクラスのRailsの拡張であるスライスメソッドを使うべきなのでしょうか。純粋なハッシュの場合、私はそれを持つことが理にかなっていることに同意します。 –

3

1つの違いはsliceは、ネストされたハッシュを可能にしながら、あなたが明示的にネストされたキーを指定しない場合は、ハッシュをネストされたpermitカットですRails 4でpermitを呼び出すとActiveModel::ForbiddenAttributesが呼び出されません.update_attributes(...)(answered here)

user.update_attributes(params.slice(:email)) # will raise ActiveModel::ForbiddenAttributes 
user.update_attributes(params.permit(:email)) # wont raise error 
関連する問題