Rails过滤器挂钩,用于在控制器操作运行之后但在呈现视图之前

时间:2013-10-10 23:52:45

标签: ruby-on-rails ruby-on-rails-4 spree

我有一个狂欢商务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}}的最佳方式是什么?我可以通过这种方式获取它的实例变量

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