2

RefineryCMS の PagesController を拡張して、プロジェクトでいくつかの apotomo ウィジェットを使用したいと考えています。

PagesController の「オーバーライド」を実行してプロジェクトにコピーする可能性がありますが、PagesController を拡張する別のエンジンを使用しています (モジュール/モンキー パッチ アプローチを使用して show メソッドと home メソッドを変更します)。それ。

私の最初のアプローチは次のようなものでした:

config/application.rb:

config.before_initialize do
  require 'pages_controller_extensions'
end

config.to_prepare do
  PagesController.send :include, Refspike::Extensions
end

pages_controller_extensions で:

module Refspike
  module Extensions
    class << PagesController
      include Apotomo::Rails::ControllerMethods
      has_widgets do |root|
        root << widget(:map)
      end
    end
  end
end

残念ながら、これは apotomo の controller_methods の "helper ActionViewMethods" 行で爆発します。include Apotomo::Rails::ActionViewMethods を追加しても役に立ちませんでした。

Rails の依存関係の管理や、Ruby のオープン クラスに関する基本的な詳細を理解しているだけだと思います。別のアプローチ、または私が見落としている単純なものはありますか?

4

2 に答える 2

0

PagesControllerは派生したActionControllerですか?

于 2011-05-19T12:11:02.953 に答える
0

これが解決策です。before_initialize のものを削除します。これをモジュールに含める必要はまったくありません。application.rb で、次のようにします。

config.to_prepare do
  ::PagesController.send :include, Apotomo::Rails::ControllerMethods
  ::PagesController.has_widgets do |root|
    root << widget(:map)
  end
end

次に、リファイナリの shared/_content_page.html.erb をオーバーライドして、以下を含めます。

<%=render_widget :map %>

やった、やった。

以前は何が間違っていましたか?呼び出し::PagesController.send :include, Refspike::Extensionsとは、実際には、変更しようとしているクラスのスコープ内に「ほぼ」入っていることを意味しますが、完全ではありません。したがって、クラスを再開する必要はありません。しかし、ActiveSupport メソッド、class_inheritable_array が apotomo によって呼び出されているのは、どうやら私のモジュール スコープでも検出できないため、次のようなことを行うことはできません。

#doesn't work
module Refspike
  module Extensions
    include Apotomo::Rails::ControllerMethods
    has_widgets do |root|
      root << widget(:map)
    end
  end
end

幸いなことに、application.rb 内の 4 行のコードはより単純なソリューションであり、それでうまくいきます。

于 2011-05-24T22:36:52.730 に答える