4

私は自分のコードを整理している最中です。これまでのところ、controllers/helpers/views「admin」フォルダーにグループ化することに成功しましたが、もともと同じモジュール名「admin」のライブラリを持っていて、それを呼び出すことができませんでしたもう。(名前の衝突?)

新しい構造:

Directory Structure
  -> app
    -> controllers 
      -> admin #new
        -> admin_main
        -> admin_permissions

    -> Helpers
      -> admin #new
        -> admin_main_helper
        -> admin_permissions_helper

  -> lib
    -> admin
      -> pagerduty.rb

以前は、次のようにヘルパーからライブラリを呼び出すことができました。

module Admin::AdminMainHelper #admin:: is new
  require "./lib/admin/pagerduty.rb"

  def pager_duty
    pagerduty = Admin::PagerDuty.new() #throws error after the new structure
    @on_call = pagerduty.first_on_call()
    @counts = pagerduty.open_incidents()
  end

end

エラーは"uninitialized constant Admin::PagerDuty"

ライブラリの名前を別の名前に変更する必要がありますか? またはこれを回避する方法はありますか?

編集:たとえば、ライブラリモジュールの名前を「Admin」ではなく「AdminLib」に変更すると機能します。したがって、問題は、これを回避する方法があるかどうかです。

4

2 に答える 2

4

Ruby で依存関係を正しい方法で要求するには、次のことを行う必要があります。

  • 名前を変更pagerduty.rb => pager_duty.rb
  • 次のように要求します。require 'admin/pager_duty'

これが可能なのは、Rails がすでに lib フォルダーを LOAD_PATH に追加しているためです。これは、完成したコードの本番環境でうまく機能します (ライブラリは通常そうです)。

しかし、開発中に lib ファイルを開発したい場合は、変更を加えるたびにサーバーを再起動する必要がなく、次のようにセットアップを変更できます。

  • この行を追加してくださいconfig/application.rb

    config.autoload_paths += %W(#{config.root}/lib)

  • コントローラーまたはモデル内の lib ファイルの明示的な require ステートメントを削除します (任意の app/* ファイル)。

これもうまくいきます。しかし、これは一般的なアンチパターンです。なぜなら:

  • アプリケーション間で共有できるように、lib コードはアプリから完全に独立している必要があります。また、オートローディング メカニズムを使用している場合は、それがアプリケーションの第一級市民であることを意味します。この場合、アプリ内に新しいフォルダー (例: app/tools) を設定し、その自動読み込みを設定する方がはるかに優れています。そうしないと、アプリに依存するコードで満たされた lib フォルダーが雑然としてしまう可能性があります。詳細はこちら

  • 既に定義されているか、複数の場所で定義されているクラス (monkeypatches など) では、オートロードは機能しません。詳細はこちら

于 2013-08-16T16:27:20.027 に答える
2

問題はロードパスにあると思います。私はそうあるrequireべきだと思います:

require "#{Rails.root}/lib/admin/pagerduty.rb"

少し手間がかかりますが、別の解決策は、lib内のすべてのサブディレクトリをロードすることです。次にLOAD_PATH例を示します。

application.rbconfig.autoload_path: _

config.autoload_paths += Dir["#{config.root}/lib/**/"]
于 2013-08-16T15:56:05.117 に答える