LoginSignup
2
1

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す22(filter_attributes 編)

Last updated at Posted at 2019-05-22

はじめに

Rails 6 に追加されそうな新機能を試す第22段。 今回のちょい足し機能は、 filter_attributes ( filter_attributes= メソッド)編です。
Rails 6.0 では、 filter_attributes で指定された model の attribute は [FILTERED] と表示されるようになります。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease でインストールできます。

$  rails --version
Rails 6.0.0.rc1

Rails プロジェクトを作る

$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1

User model を作ります

$ bin/rails g model User name sensitive
$ bin/rails db:create db:migrate

config/initializers/filter_parameter_logging.rb を編集する

sensitive を [FILTERED] にするために filter_parameter_logging.rb を編集します。

config/initializers/filter_parameter_logging.rb
Rails.application.config.filter_parameters += [:password, :sensitive]

irb で確認する

irb で User モデルを作成して、確認すると、 sensitive の値が [FILTERED] となっていることがわかります。

bash-4.4# bin/rails c
Running via Spring preloader in process 50
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> user = User.new(name: 'rails', sensitive: 'sensitive')
=> #<User id: nil, name: "rails", sensitive: [FILTERED], created_at: nil, updated_at: nil>

pp を実行した場合も [FILTERED] で表示されます。

irb(main):002:0> pp user
#<User:0x0000556be6e41c48
 id: nil,
 name: "rails",
 sensitive: [FILTERED],
 created_at: nil,
 updated_at: nil>
=> #<User id: nil, name: "rails", sensitive: [FILTERED], created_at: nil, updated_at: nil>

User model を編集する

filter_parameter_logging.rb から :sensitive を削除して、 user.rbfilter_attributes= メソッドを使います。

config/initializers/filter_parameter_logging.rb
Rails.application.config.filter_parameters += [:password]
app/models/user.rb
class User < ApplicationRecord
  self.filter_attributes += [:sensitive]
end

再度 irb で確認する

irb で User モデルを作成して、確認すると、 sensitive の値が [FILTERED] となっていることがわかります。

bash-4.4# bin/rails c
Running via Spring preloader in process 50
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> user = User.new(name: 'rails', sensitive: 'sensitive')
=> #<User id: nil, name: "rails", sensitive: [FILTERED], created_at: nil, updated_at: nil>

pp を実行した場合も [FILTERED] で表示されます。

irb(main):002:0> pp user
#<User:0x0000556be6e41c48
 id: nil,
 name: "rails",
 sensitive: [FILTERED],
 created_at: nil,
 updated_at: nil>
=> #<User id: nil, name: "rails", sensitive: [FILTERED], created_at: nil, updated_at: nil>

filter_parameters で指定した場合と model の filter_attributes で指定した場合の違い

Rails.application.config.filter_parameters で指定した場合は、全てのモデルでその attribute が [FILTERED] で表示されます。( Rails.application.config.filter_attributes で設定されているものが、 filter_attributes に反映されます。)

filter_attributes で指定した場合は、指定した model の属性だけが [FILTERED] になります。

基本的には、 Rails.application.config.filter_parameters で指定した方が漏れがなくて良いと思います。

試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try022_filter_parameters

追記

正規表現による attribute の指定も可能になってます( /sens/ を指定すると sensitive[FILTERED] になる)。

参考情報

追記2(2019/09/24)

モデルで save メソッドなどで、保存したときの SQL文は、Filter されずにそのまま出力されます。
sensitive カラムの値、sensitive は、モデルの情報として、 [FILTERED] になっていますが、SQL文は、[FILTERED]とはならず、sensitive がそのまま出力されます。

irb(main):001:0> u = User.new(name: 'rails', sensitive: 'sensitive')
=> #<User id: nil, name: "rails", sensitive: [FILTERED], created_at: nil, updated_at: nil>
irb(main):002:0> u.save
   (0.2ms)  BEGIN
  User Create (0.5ms)  INSERT INTO "users" ("name", "sensitive", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["name", "rails"], ["sensitive", "sensitive"], ["created_at", "2019-09-24 12:00:43.525329"], ["updated_at", "2019-09-24 12:00:43.525329"]]
   (8.1ms)  COMMIT
=> true
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1