前提・実現したいこと
railsのconfirmationバリデーションのコードを読んでいます。
https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/confirmation.rb
setup!メソッドの中の
klass.attr_reader(*attributes.map do |attribute| :"#{attribute}_confirmation" unless klass.method_defined?(:"#{attribute}_confirmation") end.compact)
この部分で動的にゲッターメソッドを定義していると思うのですが、これと同じように、手元のrails環境で動的にattr_readerを使ってメソッドを定義しようとしています。
class AddAttr def add(klass, sym) klass.attr_reader sym end end
irb(main):001:0> a = AddAttr.new => #<AddAttr:0x00007f94272d6668> irb(main):003:0> a.add(Team, :jump) NoMethodError: private method `attr_reader' called for Team (call 'Team.connection' to establish a connection):Class from app/validators/phone_validator.rb:19:in `setup!' from app/validators/phone_validator.rb:8:in `initialize' from app/models/team.rb:18:in `<class:Team>' from app/models/team.rb:1:in `<main>' from (irb):3
直接コンソールから行っても同じです。
irb(main):004:0> Team.attr_reader :jump NoMethodError: private method `attr_reader' called for Team (call 'Team.connection' to establish a connection):Class from app/validators/phone_validator.rb:19:in `setup!' from app/validators/phone_validator.rb:8:in `initialize' from app/models/team.rb:18:in `<class:Team>' from app/models/team.rb:1:in `<main>' from (irb):4
発生している問題・エラーメッセージ
ですが、どうもプライベートメソッドへアクセスできていないようです。
NoMethodError: private method `attr_reader'
ConfirmationValidatorクラスはどのようにして動的にゲッターメソッドを追加しているのでしょうか
補足情報(FW/ツールのバージョンなど)
ruby 2.4.2
rails 5.2.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/28 02:54