0

通常のようにいくつかのクラスを定義するRails 3アプリがあります。プラグイン内でこれらのクラスの 1 つ (「rails generate plugin ...」によって生成) を再度開き、両方のファイル (アプリ自体のファイルとプラグインのファイル) を自動的に取得する方法を見つけようとしています。開発モードではリクエストごとにリロードします。

簡単な例は次のとおりです。

# root/lib/person.rb
class Person
  Core = 1
end

# root/vendor/plugins/plugin1/lib/person.rb
class Person
  Plugin = 2
end

# root/app/views/home/index.html.erb
<%= Person::Core %> ... <%= Person::Plugin %>

そのビューがレンダリングされると、Bike::Plugin が初期化されていないというエラーが表示されます。root/lib と root/vendor/plugins/plugin1/lib の両方を autoload_paths に追加しました (理想的には、プラグインはそれを init.rb または同様の場所に追加しますが、一度に 1 つずつ追加します)。

どうすればいいですか?autoload_at は、両方の場所から Person クラスを明示的に自動ロードするように指示できれば、役立つように見えますが、運がありませんでした (ただし、まったく新しいので、間違った引数を渡している可能性があります)。 )。最後に、lib だけでなく、標準的な場所 (特にモデル) で定義されたクラスでこれを行いたいと考えています。

4

1 に答える 1

0

プラグインが以前に定義された任意のクラス (ライブラリ、または Rails 内部など) の以前の定義をオーバーライドできる 1 つの良い方法:

#vendor/plugins/myawesomeplugin/lib/person.rb
Person.class_eval do
  Plugin = 2
  # override methods here too if you want
  def name
    "hacked"
  end
end

このアプローチを使用して、前にプラグインを作成し、アクティブなレコードをオーバーロードしました

ただし、プラグインを開発モードで自動リロードできるかどうかはわかりません。通常、サーバーを開発モードで再起動したときにのみリロードされます。

于 2010-10-20T00:08:52.767 に答える