Ruby
Rails
Rails6

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


はじめに

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] になる)。


参考情報