14

Rails 3 アプリを Rails 4 に移行してattr_accessibleおり、コントローラーでプロパティを強力なパラメーターに変換中です。API ドキュメントには、属性を「許可」する方法が示されています。

def person_params
  params.require(:person).permit(:name, :age)
end

ただし、私の属性の大部分は一括割り当てに安全です。ブラックリストに登録する必要があるのは:account_id、 とのようないくつかの属性だけです。:is_admin

ほぼすべての属性をホワイトリストに登録する代わりに、属性をブラックリストに登録することはできますか? 例:

def user_params
  params.require(:user).exclude(:account_id, :is_admin)
end
4

4 に答える 4

26

@Damienが概説した理由から、実際にはそうすべきではないと思いますが、私が見つけた解決策をここに示します。

params.require(:user).except!(:account_id, :is_admin).permit!

:account_id, :is_adminこれにより、ハッシュから削除され、他のすべてのパラメーターが許可されます。しかし、繰り返しになりますが、これは潜在的に安全ではありません。

なぜこれが機能するのですか?!からActionController::Parameters継承するためです。Hash

2016 年 7 月 4 日更新

Rails 5 では、アップグレード ガイドによると、これはおそらくもう機能しません。

ActionController::Parameters は HashWithIndifferentAccess から継承しなくなりました

于 2013-09-30T10:39:46.250 に答える
2

ドキュメントから:はい、except「指定されたキーを除外する新しい ActionController::Parameters インスタンスを返す」を使用して、次のことができます。

params = ActionController::Parameters.new(a: 1, b: 2, c: 3)
params.except(:a, :b) # => <ActionController::Parameters {"c"=>3} permitted: false>
params.except(:d)     # => <ActionController::Parameters {"a"=>1, "b"=>2, "c"=>3} permitted: false>
于 2018-12-26T23:22:45.990 に答える