Rails アプリケーションで、現在のランタイム状態に応じて任意のモジュールを含める必要がある状況があります。このモジュールは、特定の条件が真の場合にのみ必要なカスタム アプリケーション コードを提供します。基本的に、現在のコンテキストから会社の名前を取得し、それをモジュールとその定義のファイル名として使用しています。
p = self.user.company.subdomain + ".rb"
if File.exists?(Rails.root + "lib/" + p)
include self.class.const_get(self.user.company.subdomain.capitalize.to_sym)
self.custom_add_url
end
私のテスト モジュールは次のようになります。
module Companyx
def custom_add_url
puts "Calling custom_add_url"
end
end
コンソールで、これは実際に正常に動作します。ユーザーをプルして、次のようにモジュールを含めることができます。
[1] pry(main)> c = Card.find_by_personal_url("username")
[2] pry(main)> include c.class.const_get(c.user.company.subdomain.capitalize)=> Object
[3] pry(main)> c.custom_add_url
custom_add_url の呼び出し
モデルからインクルード行を実行しようとすると、
NoMethodError: undefined method `include' for #<Card:0x007f91f9094fb0>
include ステートメントがコンソールでは機能するが、モデル コードでは機能しない理由を誰かが提案できますか?