4

スプリー コマース 2.1.1 アプリ (Rails 4.0.0) を持っています。製品詳細ページに「関連製品」を表示したいと考えています。関連商品は、表示されている商品と同じブランド/性別の商品をランダムに選択したものです。それは働いています...私products_controller_decorator.rbは酒宴の を拡張する を作りましたproducts_controller.rb

Spree'sproducts_controller.rbには、以下を設定する before_filter があります@product

before_filter :load_product, :only => :show

私自身のデコレータには、設定するメソッドがあります@related_products

before_filter :get_related_products, :only => :show

問題は:

a) たまたま、load_productbefore フィルターが before フィルターの前に呼び出されるため、偶然にも、それが設定する変数にget_related_productsアクセスできます。@productしかし、私が見る限り、それが起こるという保証はありません。フィルターが後で呼び出されるようにしたい...

b) Spree のshowメソッドも を設定@taxonします。これを自分の get_related_productsメソッドで使用できるようにしたいと思っています。

before_renderだから、私が欲しいのは、コントローラーメソッドが実行された後、ビューがレンダリングされる前に呼び出されるCakePHP の のようなフックです。Railsに相当するものが見つからないようです。そのようなことはありますか?after_filterビューがレンダリングされた後に呼び出されるため、私のためにはしません。

そうでない場合は、インスタンス変数を取得できるように、Spree の製品コントローラーのメソッドが実行されget_related_productsた後に呼び出しを追加する最良の方法は何ですか?show

4

1 に答える 1

5

a) Spree のload_productは、以前に登録されたget_related_productsの前に常に呼び出されます。

b) before_filterafter_filterの間にbefore_renderもフィルターもありません。

:renderを上書きすることでこれを実現できます:

class Spree::ProductsController.class_eval do
    def render(options = nil, extra_options = {}, &block)
      # here you define related products
      @related_products = search_related_products(@product)

      # don't forget to call super
      super(options, extra_options, &block)
    end
end
于 2013-10-11T00:35:27.463 に答える