NameError (undefined local variable or method `logger' for GoogleCalendarService:Class):

# NameError (undefined local variable or method `logger' for GoogleCalendarService:Class):

ActiveRecordを継承していない **GoogleCalendarService** というクラスでbulk updateした際、失敗したものがあればログとして出したい。

<img width="1419" alt="スクリーンショット 2019-09-15 10.21.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/0d68dc2c-f1db-3d8d-0391-aa8d57b0e124.png">

その際にloggerを使おうとしたがundefiedが出た。

以下のようにレシーバを **Rails** にすれば解消する。

```rb

Rails.logger.warn "Googleカレンダーとの同期に失敗した件数: #{items.length} 中、 #{res.failed_instances.length} 件"
Rails.logger.warn "エラー内容: #{res.failed_instances}"
```

### 気になったこと
ActiveRecordを継承しているクラスからはloggerを呼び出せる。

なぜActiveRecordを継承していないクラスからloggerを呼び出すとundefinedになるのか?

レシーバが特定のメソッドを呼び出せるかどうかを確認する。

```
レシーバ.respond_to?(:メソッド名)
```

```
# 呼び出せる
irb(main):029:0> Task.respond_to?(:logger)
=> true

# 呼び出せない
irb(main):030:0> GoogleCalendarService.respond_to?(:logger)
=> false
```

ActiveRecordがincludeしているモジュールの中でloggerを呼び出せるようになっているから?

確認すると、loggerはActiveSupport::Loggerで定義されているメソッド。

```
Task.logger.class
=> ActiveSupport::Logger
```

モデルがincludeしているモジュール一覧を確認する

```
モデル.included_modules（対象のモジュール名)
```

```
irb(main):026:0> Task.included_modules
=> [Task::GeneratedAssociationMethods, #<ActiveRecord::AttributeMethods::GeneratedAttributeMethods:0x00007fa468e2b8c8>, ApplicationRecord::GeneratedAssociationMethods, #<ActiveRecord::AttributeMethods::GeneratedAttributeMethods:0x00007fa468e33d70>, GlobalID::Identification, ActiveRecord::Suppressor, ActiveRecord::SecureToken, ActiveRecord::Store, ActiveRecord::Serialization, ActiveModel::Serializers::JSON, ActiveModel::Serialization, ActiveRecord::Reflection, ActiveRecord::NoTouching, ActiveRecord::TouchLater, ActiveRecord::Transactions, ActiveRecord::Aggregations, ActiveRecord::NestedAttributes, ActiveRecord::AutosaveAssociation, ActiveModel::SecurePassword, ActiveRecord::Associations, ActiveRecord::Timestamp, ActiveRecord::Callbacks, ActiveRecord::AttributeMethods::Serialization, ActiveRecord::AttributeMethods::Dirty, ActiveModel::Dirty, ActiveRecord::AttributeMethods::TimeZoneConversion, ActiveRecord::AttributeMethods::PrimaryKey, ActiveRecord::AttributeMethods::Query, ActiveRecord::AttributeMethods::BeforeTypeCast, ActiveRecord::AttributeMethods::Write, ActiveRecord::AttributeMethods::Read, ActiveRecord::Base::GeneratedAssociationMethods, #<ActiveRecord::AttributeMethods::GeneratedAttributeMethods:0x00007fa4691e4e38>, ActiveRecord::AttributeMethods, ActiveModel::AttributeMethods, ActiveModel::Validations::Callbacks, ActiveRecord::DefineCallbacks, ActiveRecord::Locking::Pessimistic, ActiveRecord::Locking::Optimistic, ActiveRecord::AttributeDecorators, ActiveRecord::Attributes, ActiveRecord::CounterCache, ActiveRecord::Validations, ActiveModel::Validations::HelperMethods, ActiveSupport::Callbacks, ActiveModel::Validations, ActiveRecord::Integration, ActiveModel::Conversion, ActiveRecord::AttributeAssignment, ActiveModel::AttributeAssignment, ActiveModel::ForbiddenAttributesProtection, ActiveRecord::Sanitization, ActiveRecord::Scoping::Named, ActiveRecord::Scoping::Default, ActiveRecord::Scoping, ActiveRecord::Inheritance, ActiveRecord::ModelSchema, ActiveRecord::ReadonlyAttributes, ActiveRecord::Persistence, ActiveRecord::Core, ActiveSupport::ToJsonWithActiveSupportEncoder, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Tryable, ActiveSupport::Dependencies::Loadable, Kernel]

irb(main):027:0> GoogleCalendarService.included_modules
=> [ActiveSupport::ToJsonWithActiveSupportEncoder, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Tryable, ActiveSupport::Dependencies::Loadable, Kernel]
```

わからない。。

ご存知のかたいらっしゃいましたらご教示お願いいたしますm(__)m