1. ホーム
  2. ruby-on-rails

[解決済み] Rails /libモジュールと

2023-05-25 07:27:57

質問

のカスタムラッパーを書いています。 open_flash_chart プラグインのカスタムラッパーを書いています。これは /lib にモジュールとしてロードし ApplicationController .

しかし、私はいくつかのクラスの階層か何かの問題があります。

どのコントローラからも open_flash_chart という関数にアクセスできます。 OpenFlashChart , Line など

しかし、クラス内で /lib モジュール内のクラスでは、うまくいきません。

何かアイデアはありますか?

どのように解決するのですか?

Railsでファイルが読み込まれる方法は2つあります。

  • autoload処理で登録され、そのファイル名に対応する定数を参照する。例えば app/controllers/pages_controller.rb で、PagesControllerを参照します。 app/controllers/pages_controller.rb が自動的に読み込まれます。これはロードパスのディレクトリのプリセットリストに対して起こります。これはRailsの機能であり、通常のRubyのロード処理の一部ではありません。
  • ファイルは明示的に require d. もしファイルが require d である場合、Ruby はロードパスの全リストを調べて、最初に require d がロードパスの中にある最初のケースを見つけます。ロードパス全体を見るには、$LOAD_PATH ($: の別名) を検査することで可能です。

ということは lib がロードパスにあるので、2つの選択肢があります。定数と同じファイル名を付けて、問題の定数を参照したときにRailsが自動的にそれらを拾うようにするか、明示的にモジュールをrequireするかです。

また、もうひとつ混乱しそうなことに気づきました。ApplicationControllerは ではなく であり、システムのルートオブジェクトです。観察してください。

module MyModule
  def im_awesome
    puts "#{self} is so awesome"
  end
end

class ApplicationController < ActionController::Base
  include MyModule
end

class AnotherClass
end

AnotherClass.new.im_awesome
# NoMethodError: undefined method `im_awesome' for #<AnotherClass:0x101208ad0>

このモジュールを使用したいクラスにインクルードする必要があります。

class AnotherClass
  include MyModule
end

AnotherClass.new.im_awesome
# AnotherClass is so awesome

もちろん、そもそもモジュールをインクルードできるようにするためには、(上記のテクニックのいずれかを使って)モジュールを利用できるようにしておく必要があります。