4

我有一个疯狂商务 2.1.1 应用程序(Rails 4.0.0),我想在产品详细信息页面上显示一些“相关产品”。相关产品将只是随机选择的与正在查看的产品具有相同品牌/性别的产品。它正在工作......我已经制作了products_controller_decorator.rb,它扩展了 spree 的products_controller.rb

Spreeproducts_controller.rb有一个 before_filter 设置@product

before_filter :load_product, :only => :show

我自己的装饰器有一个设置方法@related_products

before_filter :get_related_products, :only => :show

问题是:

a)碰巧,load_product前过滤器在我的前过滤器之前被调用get_related_products,所以巧合的是,我可以访问@product它设置的变量。但据我所知,不能保证会发生这种情况。我想确保稍后调用我的过滤器...

b) Spree 的show方法也设置@taxon了,我真的很希望能够在我自己的 get_related_products方法中使用它。

所以,我想要的是一个像 CakePHP's 这样的钩子before_render,它在控制器方法运行之后被调用,但在视图被渲染之前被调用。我似乎无法找到等效的导轨。有这样的事吗?after_filter不会为我做,因为它是在视图渲染后调用的。

如果不是,那么在Spree 的产品控制器get_related_productsshow方法运行之后,以一种我可以获取它的实例变量的方式来附加调用的最佳方法是什么?

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 回答