我有一个狂欢商务2.1.1应用程序(Rails 4.0.0),我想在产品详细信息页面上显示一些“相关产品”。相关产品只是随机选择的产品,其品牌/性别与正在观看的产品相同。它正在工作......我已经制作了products_controller_decorator.rb
,它扩展了狂欢products_controller.rb
。
施普雷的products_controller.rb
有一个设置@product
的before_filter:
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的before_render
这样的钩子,它在控制器方法运行后被调用,但是在渲染视图之前。我似乎无法找到等效的导轨。有这样的事吗? after_filter
不会为我做,因为在渲染视图后调用它。
如果没有,在Spree的产品控制器的get_related_products
方法运行之后,以show
方式调用{{1}}的最佳方式是什么?我可以通过这种方式获取它的实例变量
答案 0 :(得分:5)
a)Spree的 load_product 将始终在您之前注册的 get_related_products 之前调用。
b)没有 before_render , before_filter 和 after_filter 之间没有过滤器。
您可以通过覆盖:渲染:
来实现这一目标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